2014-03-12 32 views
0

在我正在閱讀的一個javaScript書中,它引入了一個方便的函數,它可以幫助排序方法以正確的順序輸出值(在數字的情況下)。這個函數如何與javaScript中的排序方法進行交互?

var values = [0,1,5,10,15]; 
values.sort(); 
console.log(values); //outputs 0,1,10,15,5 

function compare (value1, value2){ 
    if (value1 < value2){ 
     return -1; 
} else if (value1 > value2){ 
     return 1; 
} else { 
     return 0; 
} 

var values = [0,1,5,10,15]; 
values.sort(compare); 
console.log(values); //outputs 0,1,5,10,15 

我知道最終會發生什麼,但是我比較困惑,因爲'比較'功能是怎麼做到的!主要是因爲我不確定「比較」函數的返回值如何影響數組! 感謝朋友們!

+0

它是'sort()'的定義方式。你爲什麼困惑? –

+0

您正將'compare'傳遞給'sort',並在內部調用該函數。如果a大於b,則傳遞給sort的函數必須返回大於0的值;如果兩個值相等,則返回0;如果a小於b,則返回小於0。 –

+0

** [.sort](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)**可能會幫助你 –

回答

1

當您通過自定義比較函數的.sort()功能,它使用該功能來決定,任何兩個元素在陣列中屬於之前或之後。更詳細地說,.sort()使用算法將數組中的所有元素與其他元素進行比較,每次需要知道數組中元素A或元素B是否屬於另一元素時,調用您的自定義函數。當它收集有關數組中各個元素如何相互比較的信息時,它將按照排序順序排列數組。

這樣做的好處是,排序數組的內務處理細節和算法完全在內部完成到.sort()函數,您只需提供比較邏輯即可實現自定義排序順序。當您決定返回一個正數,0或負數返回值時,那麼這就是比較函數告訴.sort()函數傳遞給它的兩個值中的哪一個屬於數組中較早的方式,並且.sort()函數使用該信息來將項目放入最終排序數組中的正確順序。它究竟如何取決於它實際使用的排序算法。

如果你很好奇如何.sort()內部工作原理,箇中詳情是達到特定的JavaScript實現,但here's an answer,討論一些這些細節,並使用像歸併和衆所周知的排序算法快速排序項。

javascript的回調設計的美妙之處在於您可以使用.sort()並提供自定義比較函數來創建自己的排序順序,而無需知道.sort()的實際內部細節的實際工作方式。

+0

謝謝!我困惑的是這樣的: 如果你沒有明確地聲明它們是參數,JS是否會放棄值?在比較函數'(value1,value2)'中,它們只有兩個,'value1'和'value2'。我不明白比較函數如何接收數字數組... –

+0

@AntonioOrtiz - 爲了比較目的,比較函數每次只接收兩個數組元素。它不知道有關該陣列的任何信息。 '.sort()'邏輯處理數組本身。就好像你在這裏按大小排序了一堆岩石,並且你有一個幫手,並且對於每一對岩石,你都會問你的幫手 - 「嘿,鮑勃,這兩個中的哪一個更大」,Bob告訴你哪個一。然後你可以獲得這些信息,以便整理好岩石。鮑勃對岩石的整體線路一無所知,而且你知道如何比較大小,但你們兩個可以完成這項工作。 – jfriend00

1

MDN article

如果compareFunction被提供時,陣列元件根據比較函數的返回值的排序 。如果ab 是被比較的兩個元素,則:

  • 如果compareFunction(a, b)小於0,排序a到較低的指數大於b,即a至上。
  • 如果compareFunction(a, b)返回0,則將ab相對於彼此保持不變,但相對於所有不同的 元素進行排序。注意:ECMAscript標準不保證這個 的行爲。
  • 如果compareFunction(a, b)大於0,則將b分類爲低於a的索引。

然後,如果你想要的數字排序,你可以使用

[0,1,5,10,15].sort(function(a,b) { 
    return a-b; 
}); 
+0

我不認爲這回答了OP的問題。 –

相關問題