在javascript中对数组排序:
可能重复:在javascript中对数组排序:,javascript,arrays,Javascript,Arrays,可能重复: 我试图对一个数组进行排序,该数组包含xxx1、xxx2、xxx3形式的元素。sort()方法在xxx9之前工作正常,如果有名为xxx10或xxx11的元素,则会失败。顺序为xxx1、xxx10、xxx11、xxx2等。请告诉我如何修复此问题。您将看到自然字符串排序的结果。如果字符串排序不是您想要的,您应该使用自己的比较器 做一些类似于: arrayToBeSorted.sort(function(first,second) { /* some code that compar
我试图对一个数组进行排序,该数组包含xxx1、xxx2、xxx3形式的元素。sort()方法在xxx9之前工作正常,如果有名为xxx10或xxx11的元素,则会失败。顺序为xxx1、xxx10、xxx11、xxx2等。请告诉我如何修复此问题。您将看到自然字符串排序的结果。如果字符串排序不是您想要的,您应该使用自己的比较器 做一些类似于:
arrayToBeSorted.sort(function(first,second)
{
/* some code that compares 'first' with 'second' and returns <0, ==0, >0*/
});
arrayToBeSorted.sort(函数(第一、第二)
{
/*比较“first”和“second”并返回0*/
});
看看关于如何实现自然排序的帖子
Array.prototype.alphanumSort = function(caseInsensitive) {
for (var z = 0, t; t = this[z]; z++) {
this[z] = [];
var x = 0, y = -1, n = 0, i, j;
while (i = (j = t.charAt(x++)).charCodeAt(0)) {
var m = (i == 46 || (i >=48 && i <= 57));
if (m !== n) {
this[z][++y] = "";
n = m;
}
this[z][y] += j;
}
}
this.sort(function(a, b) {
for (var x = 0, aa, bb; (aa = a[x]) && (bb = b[x]); x++) {
if (caseInsensitive) {
aa = aa.toLowerCase();
bb = bb.toLowerCase();
}
if (aa !== bb) {
var c = Number(aa), d = Number(bb);
if (c == aa && d == bb) {
return c - d;
} else return (aa > bb) ? 1 : -1;
}
}
return a.length - b.length;
});
for (var z = 0; z < this.length; z++)
this[z] = this[z].join("");
}
Array.prototype.alphanumSort=函数(不区分大小写){
for(var z=0,t;t=this[z];z++){
这个[z]=[];
变量x=0,y=-1,n=0,i,j;
而(i=(j=t.charAt(x++).charCodeAt(0)){
变量m=(i==46 | |(i>=48&&i-bb)?1:-1;
}
}
返回a.length-b.length;
});
对于(var z=0;z
目前,您的数组正在按字母顺序排序,这就是您获得这些结果的原因。您需要提供自己的比较器函数来实现数字排序
试一试
您可以在回调中实现自定义排序条件,以传递到
Array.sort()
:
这是预期的行为。寻找一个自然排序实现。发布一些代码。我想你需要转换你的号码。嗨……这个很好用。谢谢。
var arr = ["xxx1","xxx10","xxx2","xxx20","xxx3","xxx30"];
var sortedArr = arr.sort( function( a, b ) {
// remove first 3 characters so remaining string will parse
a = parseInt( a.substr( 3 ) );
b = parseInt( b.substr( 3 ) );
return a - b;
});
console.log( sortedArr ); // => ["xxx1", "xxx2", "xxx3", "xxx10", "xxx20", "xxx30"]
var arr = [],
re = /^\D*(\d+)$/;
for(var i = 20; i-- > 0;) {
arr.push('xxx' + i);
}
function comparator(a, b) {
var numA = a.match(re)[1],
numB = b.match(re)[1];
return numA - numB;
}
arr.sort(comparator);
console.log(arr);