2014-12-06 62 views
1
排序數字陣列

我試圖使JS代碼片段得到一個數值數組和排序它的意義:在JavaScript

var msg = document.getElementById("message"); 

var v = [30,2,1,9,15]; 
msg.innerHTML += "<p><strong>Original order:</strong> [" + v + "]<p>"; 

v.sort(sortLowToHigh); 
msg.innerHTML += "<p><strong>After sorting:</strong> [" + v + "]<p>"; 

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

輸出:

Original order: [30,2,1,9,15] 

After sorting: [1,2,9,15,30] 

我知道這多,當單獨使用時,sort()函數將數組元素轉換爲字符串,並且該排序的結果將不受歡迎。

但我不知道如何和根據什麼過程sortLowToHigh訓練sort方法在按升序排序數值。

回答

3

當你給sort功能(稱爲比較),sort不做出關於值的任何假設(或將它們轉換成任何東西)都沒有。它只是調用重複給它的函數來比較元素對(稱爲ab),並使用該函數的返回值來確定如何對結果中的這兩個元素排序:如果它是0,ab是相等的;如果是肯定的,b應該在a之後(例如,b是「大於」a);如果是負值,b應該來之前a(例如,b「比a以下)。所以減去ba,該sortLowToHigh返回相應的值。

你提到的轉換到字符串的行爲僅適用於當你sort比較使用。

這是通過規範的§15.4.4.11覆蓋(在腫脹的散文)。

調用的順序來比較是完全直到實現,並且不同的實現可能使用不同的排序算法,所以一些JavaScript引擎可能會調用比較器的次數更多或更少,或者與其他次序不同。例如,給定這樣的:

var v = [30,2,1,9,15]; 
 
v.sort(function(a, b) { 
 
    snippet.log("a = " + a + ", b = " + b); 
 
}); 
 
snippet.log(v.join(", "));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

當前版本的Chrome輸出:

 
a = 30, b = 2 
a = 2, b = 1 
a = 1, b = 9 
a = 9, b = 15 
30, 2, 1, 9, 15 

...但Firefox輸出

 
a = 30, b = 2 
a = 2, b = 1 
a = 9, b = 15 
a = 1, b = 9 
30, 2, 1, 9, 15 

的當前版本他們都得到同樣的結果,當然還是他們中的一個將違反規範,但它很有趣地看到,調用的順序確實有所不同。

4

sort接受比較功能。所有函數需要做的是比較兩個值,如果a被認爲小於b,則返回小於0的值;如果a大於b,則返回大於0;如果相等,則返回0。使用該比較,排序功能處理實際的排序。

對於數字,這個比較功能很簡單。您只需返回a - b,並且您的退貨價值爲<00>0