Jquery tablesorter自定义排序选项

时间:2014-09-16 08:39:36

标签: jquery tablesorter

我正在使用jquery tablesorter。表格分类器具有默认顺序,如数字,特殊字符和字母表。 我需要首先排序特殊字符数字字母

在第3栏(动物)上查看此网址

jsfiddle.net/Mottie/abkNM/325/

对此有何帮助?

1 个答案:

答案 0 :(得分:1)

默认的自然排序将内容分解为块以进行比较,但这些块由文本字符和数字的“块”设置。当遇到非文本/数字字符时,它不会被分开。

因此,在您的演示中,值“#Elephant”和“0Zebra”排序将这些值分解如下:

#Elephant => [ '#Elephant' ]
0Zebra    => [ '0', 'Zebra' ]

比较完成时,它看到“#Elephant”是非数字的,但“0”是数字,因此基于ascii comparison,非数字(假设为字母字符)值大于数值;因此“#Elephant”在“0Zebra”之后排序。

我知道你没有要求解释,但解决这个问题的最简单方法是改变分拣机。请改用简单文本排序器(demo):

$('table').tablesorter({
    textSorter: {
        2: $.tablesorter.sortText
    }
});

更新:如果您需要特定排序,则需要重新排序ascii值。我设置了特定于数据的this demo,它只更改了第一个字符。

var reorderAscii = function(x){
    if (x === '') { return x; }
    var v = x.charCodeAt(0),
        z = x.charCodeAt(0);
    if ( z > 90 && z < 97) {
        // move [\]^_` to replace ABCDEF
        v = v - 26;
    } else if (z > 122 && z < 127) {
        // move {|}~ to replace GHIJ
        v = v - 52;
    } else if (z > 47 && z < 58) {
        // move 0123456789 to replace KLMNOPQRST
        v = v + 27;
    }
    return z !== v ? String.fromCharCode(v) + x.slice(1) : x;
};

$('table').tablesorter({
    theme: 'jui',
    headerTemplate: '{content}{icon}',
    // ignoreCase must = true
    ignoreCase: true,
    textExtraction: function(node, table, cellIndex){
        var t = $.trim( $(node).text().toLowerCase() );
        return cellIndex === 2 ? reorderAscii(t) : t;    
    },
    textSorter: function (a, b) {
        if (a == b) { return 0; }
        if (a == '') { return 1; }
        if (b == '') { return -1; }
        return a > b ? 1 : -1;
    },
    widgets: ['uitheme', 'zebra', 'columns'],
    widgetOptions: {
        zebra: [
            "ui-widget-content even",
            "ui-state-default odd"]
    }
});

我忘了提到使用字母数字分拣机旁边的任何其他分拣机,将忽略空单元格和字符串单元格排序。我需要在文档中包含它。