2013-11-02 147 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);