我有一个包含字母和字母的项目列表。数字两种类型的值。 我需要对它们进行排序,如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);
});
}
});
答案 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;
}
}
}