2

可能重复:
对混合的字母/数字数组进行排序

我正在尝试对包含 xxx1、xxx2、xxx3 形式的元素的数组进行排序。Array.sort() 方法在 xxx9 之前工作正常,如果有一个名为 xxx10 或 xxx11 的元素,它会失败。顺序为 xxx1、xxx10、xxx11、xxx2 等。请让我知道如何解决这个问题。

4

3 回答 3

3

您正在看到自然字符串排序的结果。如果字符串排序不是您想要的,您应该使用自己的比较器。

执行以下操作:

arrayToBeSorted.sort(function(first,second)
{ 
  /* some code that compares 'first' with 'second' and returns <0, ==0, >0*/ 
});
于 2012-11-05T11:32:17.347 回答
0

目前,您的数组正在按字母顺序排序,这就是您获得这些结果的原因。您需要提供自己的比较器函数来实现数字排序。

尝试

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"]
于 2012-11-05T11:36:36.713 回答
0

您可以在回调中实现自定义排序条件以传递到Array.sort()

​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);
​

http://jsfiddle.net/f0t0n/qz62J/

于 2012-11-05T11:39:29.637 回答