2013-11-02 108 views
0

我在数值数组中遇到了奇怪的排序结果。例如排序结果[1,2,10,20,100,200]:为什么JavaScript不按数字顺序排序数值数组?

> [1, 2, 10, 20, 100, 200].sort() 
[ 1, 10, 100, 2, 20, 200 ] 

为什么发生这种情况?

看来什么数组排序不能用于直接排序数值数组?

+1

是的。这就是它在规范中的定义:http://es5.github.io/#x15.4.4.11。 –

+1

可能重复[排序不与整数?](http://stackoverflow.com/questions/1063007/sort-not-working-with-integers) – darthmaim

回答

8

the MDN documentation来自:

如果未提供的compareFunction,元件通过将它们转换为字符串,并在字典(“字典”或“电话薄”,而不是数值)顺序比较字符串排序。

(或见EMCAScript specification的相关部分,帽尖费利克斯·克林为挖参考)

如果你想要做一个数字排序,然后通过一个比较功能:

[1, 2, 10, 20, 100, 200].sort(function (a,b) { return a-b; }); 
+0

正确的名称是“Kling”,与“l”。不用担心,大多数人似乎弄错了;) –

+0

它就在我的面前。现在我不能在人们眼前至少一周的时间里误导我的名字拼写错误! – Quentin

0

array.sort只对字符串排序。排序号使用:

[1, 2, 10, 20, 100, 200].sort(function(a,b) { return a-b }); 
0

尝试此数字排序:

[ 1, 10, 100, 2, 20, 200 ].sort(function(a,b){return a-b}) 
0

的sort()方法调用每个项目的()的字符串转换函数,然后比较字符串,以确定正确的订购。即使数组中的所有项都是数字,也会发生这种情况。 试试这种方式:

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