按字母数字排序一组li标签

Joe*_*oel 3 javascript arrays sorting jquery

我一直在试图获得一个功能,它将按照内容对选择的li标签进行排序,但目前无济于事(至少没有速度/准确度);

$('.sortasc').live('click',function(){

        var liArr = Array();

        $('#licontainer').children('li').each(function(){
           liArr.push($(this).html());
        });

        liArr.sort(alphaNumSort);

        $(liArr).each(function(){
            var current = this;

            var clone = $('li').filter(function(){return($(this).html()==current);}).clone();

            $('li').filter(function(){return($(this).html()==current);}).remove();

            clone.appendTo('#tempsortbox');

        });

        $('#licontainer').html($('#tempsortbox').html());
        $('#tempsortbox').html('')

    });
Run Code Online (Sandbox Code Playgroud)

它既慢又不排序.理想情况下,它会根据位于li中的强标记的内容进行排序.

这是alphaNumSort函数,如果你感兴趣的话(这可以解决它只是蹩脚的HTML和克隆垃圾而不是真的有用)

function alphaNumSort(m,n){
try{
    var cnt= 0,tem;
    var a= m.toLowerCase();
    var b= n.toLowerCase();
    if(a== b) return 0;
    var x=/^(\.)?\d/;

    var L= Math.min(a.length,b.length)+ 1;
    while(cnt< L && a.charAt(cnt)=== b.charAt(cnt) &&
    x.test(b.substring(cnt))== false && x.test(a.substring(cnt))== false) cnt++;
    a= a.substring(cnt);
    b= b.substring(cnt);

    if(x.test(a) || x.test(b)){
        if(x.test(a)== false)return (a)? 1: -1;
        else if(x.test(b)== false)return (b)? -1: 1;
        else{
            var tem= parseFloat(a)-parseFloat(b);
            if(tem!= 0) return tem;
            else tem= a.search(/[^\.\d]/);
            if(tem== -1) tem= b.search(/[^\.\d]/);
            a= a.substring(tem);
            b= b.substring(tem);
        }
    }
    if(a== b) return 0;
    else return (a >b)? 1: -1;
}
catch(er){
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

}

干杯

Ale*_*ett 11

我不完全确定你的alphaNumSort函数是做什么的,但是简单的字符串比较可能就足够了.

var li = $('#licontainer li').get();

// sort the list items based on the contents of a nested strong tag
li.sort(function(a, b) {
    a = $('strong', a).text();
    b = $('strong', b).text();

    // you may want to process the text values further here, perhaps
    // running it through $.trim, reducing whitespace sequences with
    // a regular expression, or lower- or upper-casing letters to
    // make the comparison case-insensitive.

    return (a < b) ? -1 : ((a > b) ? 1 : 0);
});

// reinsert the list items in their new order
$('#licontainer').append(li);
Run Code Online (Sandbox Code Playgroud)

这应该比临时列表方法快得多,因为它执行的DOM操作更少.原生字符串比较的使用也应该比您当前的排序算法快一点,但是如果它正在做某些特定的事情我错过了更新return语句来使用它(保留前面的行).

return alphaNumSort(a, b);
Run Code Online (Sandbox Code Playgroud)

如果这仍然太慢,您可能会通过在操作之前隐藏列表来进一步提高性能,从而阻止浏览器执行不必要的重新绘制.

var li = $('#licontainer').hide().find('li').get();

// ...

$('#licontainer').append(li).show();
Run Code Online (Sandbox Code Playgroud)