2014-01-09 76 views
4

這看起來像一個簡單的排序,但JavaScript給出了不正確的結果。JavaScript爲什麼不能排序[5,10,1]?

我做錯了什麼或者這是一種語言怪癖?

[5,10,1] .sort();

[1,10,5]

+4

似乎完全良好有序的*詞法順序*。 – deceze

+3

我討厭引用Atwood,但是...... [編程的第一條規則](http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your -fault.html)在這裏是相關的。 –

回答

17

的Javascript字母順序排列。這意味着「10」低於「5」,因爲「1」低於「5」。

function sorter(a, b) { 
    if (a < b) return -1; // any negative number works 
    if (a > b) return 1; // any positive number works 
    return 0; // equal values MUST yield zero 
} 

[1,10, 5].sort(sorter); 

或者你可以通過簡單的功能作弊:

成數值,你需要在數字比較器通過這樣的排序

這個較短功能背後
function sorter(a, b){ 
    return a - b; 
} 

[1, 10, 5].sort(sorter); 

邏輯是比較必須返回x>0 if a > b,x<0 if a < bzero if a is equal to b。所以如果你有

a=1 b=5 
a-b will yield negative(-4) number meaning b is larger than a 

a=5 b=1 
a-b will yield positive number(4) meaning a is larger than b 

a=3 b=3 
a-b will yield 0 meaning they are equal 
+0

這是太多的代碼! –

+0

@KellyJAndrews在哪裏?第二種方法被廣泛使用。當然你可以直接嵌入它,如果你喜歡size>可讀性更小 –

+0

我在一行中做了我的例子,你使用的最小的是3. –

0

默認的排序順序是字母和升序。如果要排序的數量,你可以做這樣的事情:

function sortNumber(a,b) { 
    return a - b; 
} 

var numArray = [140000, 104, 99]; 
numArray.sort(sortNumber); 
0
function sortit(a, b){ return (a-b); } 
[1, 5, 10].sort(sortit); 
2

你必須給一個函數傳遞給排序方法。

var points = [5, 10, 1]; 
points.sort(function(a,b){return a-b}); 

Here是一個工作小提琴。

+0

另外 - [this](http://www.w3schools.com/jsref/jsref_sort.asp)是W3C學校對此的詳細信息。 –

+0

W3C學校是一個不好的參考 – Jacob

+3

它得到一個壞的說唱,但我認爲對於簡單的基礎知識,它是準確的。 –

0

你可以試試:

[5, 10, 1].sort(function(a, b){ return a - b }) # print [1, 5, 10] 
0

你可以嘗試

[5, 10, 1].sort(function(a,b){return a-b}) 
相關問題