2017-07-26 123 views
0

爲什麼這個函數返回的元素按字母順序排序而不是數字排序?無論使用Number還是ParseFloat,我都可以得到相同的結果。爲什麼按字母順序排序數字輸入?

function sortMe() { 
    var x = ["1.0","2.5", "11.0"]; 
    var y = x.map(Number); 
    Logger.log(y.sort()); 
} 

結果:1,11,2.5

回答

2

因爲Array#sort各種字母,所以'11''2'之前。

sort()方法進行排序的陣列in place的元素並返回該數組。排序不一定是stable。默認的排序順序是根據字符串Unicode代碼點。

爲了克服這個問題,你可以使用一個數值排序有一個回調,像

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

Oy。顯然這是[它如何正確完成](https://stackoverflow.com/a/21595293/403455)。 –

1

,由於默認的排序順序是按照字符串的Unicode代碼點,無論你輸入的是什麼。您的Number隱式轉換回字符串,然後排序。

-1

sort()方法對數組的項進行排序。

排序順序可以是字母或數字,也可以是升序(上)或降序(下)。

默認情況下,sort()方法根據每個元素的Unicode點值按字母順序和升序排列值。

有一個看看這個例子:

var fruit = ['cherries', 'apples', 'bananas']; 
fruit.sort(); // ['apples', 'bananas', 'cherries'] 

var scores = [1, 10, 21, 2]; 
scores.sort(); // [1, 10, 2, 21] 
// Note that 10 comes before 2, 
// because '10' comes before '2' in Unicode code point order. 

var things = ['word', 'Word', '1 Word', '2 Words']; 
things.sort(); // ['1 Word', '2 Words', 'Word', 'word'] 
// In Unicode, numbers come before upper case letters, 
// which come before lower case letters. 
+0

訂單可以是「默認」或「您在分類功能中編程的任何內容」。沒有「數字」或「升序/降序」的特殊設置。 –

0

它不是,你是無法傳遞一個數字數組,無論你通過Array#sort會嘗試他們的Unicode表示的基礎上進行比較。取而代之的是通過一個比較器,比較你想在排序時想要比較的方式

y.sort((a,b)=>a-b)