可能重复:
对混合的字母/数字数组进行排序
我正在尝试对包含 xxx1、xxx2、xxx3 形式的元素的数组进行排序。Array.sort() 方法在 xxx9 之前工作正常,如果有一个名为 xxx10 或 xxx11 的元素,它会失败。顺序为 xxx1、xxx10、xxx11、xxx2 等。请让我知道如何解决这个问题。
可能重复:
对混合的字母/数字数组进行排序
我正在尝试对包含 xxx1、xxx2、xxx3 形式的元素的数组进行排序。Array.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*/
});
目前,您的数组正在按字母顺序排序,这就是您获得这些结果的原因。您需要提供自己的比较器函数来实现数字排序。
尝试
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"]
您可以在回调中实现自定义排序条件以传递到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);