jQuery Tablesorter自定义解析器,当没有可用日期时,使用默认的`-`对日期进行排序

时间:2014-07-29 15:01:17

标签: date tablesorter

我编写了自定义解析器,以格式对日期进行排序: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类似,可为-字段提供默认值,但并非如此 帮助

1 个答案:

答案 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" (值为undefinednull,空字符串或值为零),它将替换为右侧的值。

第二部分是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

三元运算符可以嵌套,读起来非常混乱,所以要使用它们,但不要疯了;)