我在 Javascript 中遇到了数值数组的奇怪排序结果。例如排序 [1,2,10,20,100,200] 的结果:
> [1, 2, 10, 20, 100, 200].sort()
[ 1, 10, 100, 2, 20, 200 ]
为什么会这样?
似乎数组排序不能用于直接对数字数组进行排序?
我在 Javascript 中遇到了数值数组的奇怪排序结果。例如排序 [1,2,10,20,100,200] 的结果:
> [1, 2, 10, 20, 100, 200].sort()
[ 1, 10, 100, 2, 20, 200 ]
为什么会这样?
似乎数组排序不能用于直接对数字数组进行排序?
从MDN 文档:
如果未提供 compareFunction,则通过将元素转换为字符串并按字典(“字典”或“电话簿”,而不是数字)顺序比较字符串来对元素进行排序。
(或查看EMCAScript 规范的相关部分,向 Felix Kling 致敬以挖掘参考资料)
如果要进行数字排序,请传递一个比较函数:
[1, 2, 10, 20, 100, 200].sort(function (a,b) { return a-b; });
JavaScript 中的数组排序是通过 方法完成的array.sort()
。调用sort()
本身只是按字母顺序对数组进行排序,例如:
var array=[40, 6, 300];
array.sort();
数组现在变为 [300,40,6],该函数将仅按第一个数字排序。
在这种情况下要排序编写一个函数:
Array.sort(function(number1, number2){
return number1-number2;
})
数组现在变为 [6,40,300]。
array.sort
只对字符串进行排序。要对数字进行排序,请使用以下命令:
[1, 2, 10, 20, 100, 200].sort(function(a,b) { return a-b });
试试这个进行数字排序:
[ 1, 10, 100, 2, 20, 200 ].sort(function(a,b){return a-b})
sort() 方法对每个项目调用 String() 转换函数,然后比较字符串以确定正确的顺序。即使数组中的所有项目都是数字,也会发生这种情况。试试这个方法:
function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}
[ 1, 10, 100, 2, 20, 200 ].sort(compare);