2016-05-28 60 views
1

我已經JavaScript的數組如下:錯誤分類array.Javascript

a=[0, "b", 2, 3, 4, 5, 1, 9, 8, "A", "a", 11010] 

現在我想對它進行排序,我不喜歡這樣

a.sort() 

但後來我得到如下:

[0, 1, 11010, 2, 3, 4, 5, 8, 9, "A", "a", "b"] 

我認爲這是錯誤的,因爲11010大於2,它應該在2. 也即使我做到以下幾點:

a.sort(function(a,b){return a-b;}); 

我得到如下:?

[0, "b", 11010, 2, 3, 4, 1, 8, 9, "A", "a", 5] 

有人能解釋我爲什麼發生這種情況謝謝

+1

可能的重複[Javascript - 排序字母組合](http://stackoverflow.com/questions/6019731/javascript-sort-letter-number-combination) –

+0

什麼是您的目標排序從排序操作,和爲什麼數組中的字符串和數字都是? – Trajanson

+0

A [快速閱讀MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)解釋了爲什麼 – chazsolo

回答

1

你的數組有數字和字符串。你需要做的是提供一個比較功能。

a = [0, "b", 2, 3, 4, 5, 1, 9, 8, "A", "a", 11010] 
a.sort(function(c1, c2) { 
    if(typeof c1 === "number" && typeof c2 == "number") { 
     return c1 - c2; 
    } else {  
     return (c1 + "").localeCompare(c2); 
    } 
); 
3

的問題是,排序時,JavaScript的對待所有的數組元素默認爲字符串。

JavaScript不是類型安全的,就像Haskell或Java一樣。這意味着您可以執行各種瘋狂操作,如添加數字和字符串,或者將字符串與數字進行比較而不會引發錯誤。

UTF-8 Character Code Table

正如你可以在此表中看到的,得到的49的值,其是小於97的下殼體一個

「1」的值被設置之前,「10110」爲「一」被「蘋果」之前排序同樣的原因


This video涵蓋了很多非常意外默認patte的由不同類型的操作導致的JavaScript代碼。

+1

*「因爲您包含字符串元素」* even沒有字符串值,所有元素將被視爲字符串。 –

+1

是的,那是他的第一個答案。 – aifrim

2

看看array.sort如何工作在link

如果你不提供自己的排序功能,然後

「的元素由Unicode代碼點順序將它們轉換爲字符串和比較 字符串來分類的。」

作爲一個字符串,11010在2之前。您還沒有提供排序函數,所以排序方法使用默認行爲。

這就是爲什麼你看到你已經注意到的行爲。