1

我正在构建一个 jQuery 表格排序脚本。是的,是的,我知道有插件,但是摆脱别人的大衣尾巴有什么乐趣(更不用说完全缺乏学习和理解)?

所以我已经对 alpha 类型进行了很好的排序,我现在正在研究数字排序。

这么快又脏。我得到列值并将它们推入一个数组:

    var counter = $(".sort tr td:nth-child("+(columnIndex+1)+")").length;

    for (i = 1; i <= counter; i++) {
        columnValues.push($(".sort tr:eq("+i+") td:eq("+columnIndex+")").text());
    }

然后我对它们进行排序:

    columnValues.sort(function(a,b){
        return a-b
    });

然后我检查唯一条目(这主要用于相同的名称):

    $.each(columnValues, function(i, el){
        if($.inArray(el, uniqueColumns) === -1) uniqueColumns.push(el); 
    });

然后我使用数组作为键列表从表中获取数据并推入另一个数组。这就是问题所在。对于名称,它可以正常工作,但对于数字(即 3、30、36)则不行。对于以 3 开头的排序列表,它会在 30 和/或 36 中看到 3 并抓取它。

这是我尝试过的:

    for (i = 0; i < counter; i++) {
        var key = uniqueColumns[i];

        $(".sort tr:contains("+key+") td").each(function(){
            rowValues.push($(this).text());
        });

    }

和:

    for (i = 0; i < counter; i++) {
        var key = uniqueColumns[i];

        $(".sort tr td").filter(function(i){
            if($(this).text() === key) {
                rowValues.push($(this).text());
            }
        });
    }

这是使用第一组代码运行代码的小提琴(比第二组更好):

更新:

也刚刚尝试过(仍然无法正常工作,适用于初始排序但不适用于后续排序):

    for (i = 0; i < counter; i++) {
        var key = uniqueColumns[i];
        var found = false;

        $(".sort tr:contains("+key+")").filter(function(j){
            $(this).children().each(function(){
                if ($(this).text() === key) {
                    found = true;
                } 
            });

            $(this).children().each(function(){
                if (found) {
                    rowValues.push($(this).text());
                } 
            });
        });
    }
4

1 回答 1

0

我自己想出来的。决定采用完全不同的方法。我从表数据中创建了一个多维数组,然后创建了一个适用于数字和 alpha 数据的自定义排序函数。这是获取数据、对数据进行排序和重写表的函数。

function sort(column) {
    var columnIndex = $(column).index(),
    rowValues = [];

    /* Get Data */
    $(".sort tr").not(":first-child").each(function () {
        var innerArray = [];

        $(this).find('td').each(function () {
            innerArray.push($(this).text());
        });

        rowValues.push(innerArray);
    });

    /* Sort Data */
    rowValues.sort((function(index){
        return function(a, b){                
            if (!isNaN(a[index])) {
                a[index] = parseInt(a[index]);
            }

            if (!isNaN(b[index])) {
                b[index] = parseInt(b[index]);
            }

            return (a[index] === b[index] ? 0 : 
                   (a[index] < b[index] ? -1 : 1));
        };
    })(columnIndex));

    /* Replace Data */
    $(".sort tr").not(":first-child").each(function(i){
        $(this).find("td").each(function(j){
            $(this).replaceWith("<td>"+rowValues[i][j]+"</td>");
        });
    });
}
于 2013-03-01T15:32:41.910 回答