我编写了自定义解析器,以格式对日期进行排序:23-jul-2014
$.tablesorter.addParser({
// set a unique id
id: 'dates',
is: function(s, table, cell) {
// return false so this parser is not auto detected
return false;
},
format: function(s, table, cell, cellIndex) {
// capture groups for rearranging
pattern = /(^\d{2})-([A-Z]{3})-(\d{4})/gi;
parts = pattern.exec(s);
date = parts[2]+" "+parts[1]+", "+parts[3];
return date ? $.tablesorter.formatFloat((new Date(date).getTime() || ''), table) || s : s;
},
// set type, either numeric or text
type: 'numeric'
});
,但在我缺少日期的某些字段中,字面意思是-
。
发生这种情况时,排序会停止工作,因为它无法识别为 正则表达式匹配。
如何更改解析器代码,以便它仍然可以对该列进行排序,
只是忽略这些具有-
的字段,并对那些具有该字段的字段进行排序
正确的日期为23-jul-2014
?
我尝试将s
语句中的最后return date...
替换为某些内容
与1-jan-1970
类似,可为-
字段提供默认值,但并非如此
帮助
答案 0 :(得分:1)
没有必要拆分日期的所有部分。只需用空格替换短划线即可(demo):
$(function () {
$.tablesorter.addParser({
// set a unique id
id: 'dates',
is: function (s, table, cell) {
// return false so this parser is not auto detected
return false;
},
format: function (s, table, cell, cellIndex) {
var date = new Date(s.replace(/-/g, ' '));
return $.type(date) === 'date' ? $.tablesorter.formatFloat(date.getTime(), table) || s : s;
},
// set type, either numeric or text
type: 'numeric'
});
$('table').tablesorter({
theme: 'blue',
widgets: ['zebra']
// add headers option here or "sorter-dates" class to header
// ,headers : { 6 : { sorter: 'dates' } }
});
});
更新(来自评论中的问题):
|| s : s
代码有两个不同的事情。
在这种情况下,第一部分|| s
确实不是必需的,因为如果formatFloat
函数不是数字,它将返回相同的值。两个垂直条表示" OR",因此0 || 'x'
将导致'x'
。所以当javascript遇到" OR" this || that
如果左侧部分被确定为" falsy" (值为undefined
,null
,空字符串或值为零),它将替换为右侧的值。
第二部分是ternary operator的结尾。基本上格式是:
condition ? value_if_true : value_if_false;
所以在上面的函数
return $.type(date) === 'date' ? $.tablesorter.formatFloat(date.getTime(), table) || s : s;
我们返回一个三元运算符(只返回条件匹配部分):
condition
为$.type(date) === 'date'
,以确保我们有日期对象value_if_true
部分为$.tablesorter.formatFloat(date.getTime(), table) || s
value_if_false
部分为s
三元运算符可以嵌套,读起来非常混乱,所以要使用它们,但不要疯了;)