Jquery,sort&分组字母数字值

时间:2014-03-25 08:37:49

标签: javascript jquery sorting

我有一个包含字母和字母的项目列表。数字两种类型的值。 我需要对它们进行排序,如Alphabets排序然后编号排序。例如:Apple Car 23 45 我可以使用以下方式对它们进行排序:

$(function() {
    $.fn.sortList = function() {
        debugger;
    var mylist = $(this);
    var listitems = $('a', mylist).get();
    listitems.sort(function(x, y) {
        if (isNaN(x.text) && isNaN(y.text)) {
            var compA = $(x).text().toUpperCase();
            var compB = $(y).text().toUpperCase();
            return (compA < compB) ? -1 : 1;
        } else {
            return (x.text < y.text) ? -1 : 1;}
        }
    );
    $.each(listitems, function(i, itm) {
        mylist.append(itm);
    });
   }    
});

//Call this function to sort the list
$("div#countries").sortList();

但是使用这个,数字有时排序有时排序,有时未排序(不确定为什么),&amp;数字后字母排序完美。 我尝试搜索许多论坛进行排序和排序完全分组,但在jquery我无法做到。(我想念C#LinQ):|请帮忙。

编辑1:

根据以下建议,我使用此代码,但我的数字值也以字符串的形式出现,这就是数字未被整理的原因。

代码:

$(function() {
    $.fn.sortList = function() {
        debugger;
    var mylist = $(this);
    var listitems = $('a', mylist).get();
    listitems.sort(function(x, y) {
        if($.isNumeric(x.text)){
            x.text = parseInt(x.text);
        }
        if($.isNumeric(y.text)){
            y.text = parseInt(y.text);
        }

        var a = Number(x.text);
        var b = Number(y.text);
        if (isNaN(a)) {
                    if (isNaN(b)) {
                        var compA = x.text.toUpperCase();
                        var compB = y.text.toUpperCase();
                        return (compA < compB) ? -1 : 1;
                    } else {
                        return -1;
                    }
                } 
        else{
                    if (isNaN(b)) {
                        return 1;
                    } else {
                        return a - b;
                }
            }
        });

    $.each(listitems, function(i, itm) {
        mylist.append(itm);
    });
   }    
}); 

1 个答案:

答案 0 :(得分:0)

问题是isNaN在提供字符串时需要一个数字。 此外,您不会处理x是数字且y是字符串的情况,反之亦然。

你应该使用这个比较器:

function compare(x, y) {
    var a = Number(x.text);
    var b = Number(y.text);
    if (isNaN(a)) {
        if (isNaN(b)) {
            var compA = x.text.toUpperCase();
            var compB = y.text.toUpperCase();
            return (compA < compB) ? -1 : 1;
        } else {
            return -1;
        }
    } else {
        if (isNaN(b)) {
            return 1;
        } else {
            return a - b;
        }
    }
}