我一直在尝试编写一个函数,按照它们的内容对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('')
});
它既慢又不太擅长排序。理想情况下,它应该根据li中包含的strong标签的内容进行排序。
如果您有兴趣,这里是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;
}
}
Cheers
Array.sort
是非标准的,应该使用Array.prototype.sort.call
。 - bobinceArray.sort
绝对是标准方法,但它肯定不如使用Array.prototype
兼容。我会根据您的评论更新我的答案,并将文本后处理作为读者的练习 :) - Alex Barrettli.get().sort
更符合代码读者的直觉。 - Roatin Marthget()
,因为sort()
是原地操作。 - Alex Barrett