2012-03-22 63 views
9

JavaScript sort function which takes a parameter允許你傳入一個函數。JavaScript排序功能如何工作(作爲算法)?

例如:

var myarray=[25, 8, 7, 41] 
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41] 

它是如何的代碼

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

被解釋爲上升?它應該分爲三種情況,分別是< 0,== 0> 0,但當ab可以是什麼時,這有什麼意義?

謝謝!

+0

重複:http://stackoverflow.com/questions/1494713/how-does-javascripts-sort-work – alishaukat 2015-10-06 12:21:07

回答

6

回答你的問題的原因特別棘手,或者至少是詳細的,是因爲沒有規範說明瀏覽器應該實現哪種排序算法。因此,告訴你具體的瀏覽器在一個瀏覽器上的工作方式可能會有所不同,甚至會隨着時間而改變。

它的要點是,你想把「a」和「b」想成任何兩個值。如果您返回「a」 - 「b」的結果,那麼您的排序按升序排列。如果你做「b」 - 「a」,那麼它是按降序排列的。

有關製作自己的排序函數的巧妙之處在於,您可以在單獨的函數中處理它們之後比較「​​a」和「b」的值。因此,讓我們說你想按照攝氏度值排序,但是你的數組只用華氏溫度。你可以這樣做:

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

這真的很酷,您可以如何創建自定義排序功能!謝謝 ! – Coffee 2012-03-22 22:42:11

+0

@sch - 非常感謝,我現在會記得這個!你們是最棒的! – Coffee 2012-03-22 22:48:19

+0

不喜歡攝氏度嗎? farenheit具有不同因素的移動比例,但排序相同。 – 2016-09-07 06:26:39

2

因爲如果b大於a,它將小於0.如果a == b,它將返回0.否則它將是一個正數。

+0

因此,它經歷了每一對數字和檢查? – Coffee 2012-03-22 22:16:32

+1

它取決於如何執行sort。 – 2012-03-22 22:17:13

+0

嗯,我明白了,好吧,它是geetting更清晰。謝謝! – Coffee 2012-03-22 22:18:28

1

這是比較容易理解的一個例子。讓我們研究每種可能的情況:

  1. 讓a = 10和b = 20。所以a - b-10,按照慣例,我們返回一個負值,如果a < b,所以我們很好。
  2. 設a = 20和b = 10。所以a - b10,按照慣例,我們返回一個正值,如果a > b,所以我們仍然很好。
  3. 設a = 10和b = 10。所以a - b0,按照慣例我們會返回0如果a == b,並且一切按預期工作!

一般情況下:如果a < ba - b將始終爲負;如果a > ba - b將始終爲正;並且如果a == ba - b將始終爲0,只要ab是整數值。

+0

非常感謝,奧斯卡!它點擊! – Coffee 2012-03-22 22:41:33

5

功能sort將調用compareFunction函數多次,並傳遞到項目ab它。這將發生多次,直到數組排序。

比較功能應該返回:

  • 0,如果a == b;
  • 如果a > b爲正數;
  • 如果b < a爲負數。

現在,讓我們來看看在你的代碼的功能,我們有a - b =

  • 0,如果a == b;
  • 如果a > b爲正數;
  • 如果b < a爲負數。

因此,它返回預期的結果,數組將被正確排序。請致電documentation

+0

非常感謝你,sch。我現在明白了,並且還閱讀了參考資料,非常詳盡! – Coffee 2012-03-22 22:41:07

+0

非常感謝,現在我會記住這一點!你們是最棒的! – Coffee 2012-03-22 22:48:40

2

該函數需要2個參數(a,b)。該函數從b中減去並返回結果。如果返回值是
正 - A比B
負的數 - A比B
ZERO少一個數字 - 一個等於b

基於瀏覽器的行爲是不同的:看到不同瀏覽器產生的輸出:

var numArray = [20,1,10,2,3]; 
numArray.sort(function(a,b) { 
    document.write("a = " + a + ", b = " + b + "<br />"); 
    return a-b} 
); 

output on firefox : 
a = 20, b = 1 
a = 20, b = 10 
a = 1, b = 10 
a = 2, b = 3 
a = 20, b = 2 
a = 1, b = 2 
a = 10, b = 2 
a = 10, b = 3 


output on chrome: 
a = 20, b = 1 
a = 20, b = 10 
a = 1, b = 10 
a = 20, b = 2 
a = 10, b = 2 
a = 1, b = 2 
a = 20, b = 3 
a = 10, b = 3 
a = 2, b = 3 

希望這有助於!

3
var myarray=[25, 8, 7, 41] 
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41] 

根本改變,要

var myarray=[25, 8, 7, 41] 
myarray.sort(function(a,b){console.log("comparing " + a + ", " + b);return a - b}) //Array now becomes [7, 8, 25, 41] 

您嘗試了上面的代碼後,在控制檯日誌中,您將看到以下結果

var myarray=[25, 8, 7, 41] 
 
    myarray.sort(function(a,b){console.log("comparing " + a + ", " + b);return a - b}) //Array now becomes [7, 8, 25, 41]

是插補上升?它應該被分成三種情況,< 0,== 0和> 0;但是當a和b可以是任何東西時,這是如何有意義的?

第一個比較:25,8

現在,讓我們回答你它是如何的動產的價值毋庸置疑,B。當你運行代碼時,你會發現第一次比較是在25,8之間,如果結果是正數,那麼意味着8比較小。因此它只是重新排序它至8個,25

第二比較:25,7

接着比較25,7之間進行,這是因爲,如果結果是否定的,則第三個數字將被投入25之後,三個數字的排序完成。

但情況不同,現在結果再次出現積極。所述陣列還重新排序本身

8, 7, 25 

,直到找到該條件是正的,它再次執行測試之後。所以現在它比較8,7,結果又是負面的。

陣列再次重新排序本身

7, 8, 25 

第三比較:25,41

現在,在這最後的比較中,結果來自作爲陽性,這意味着41大於25 。

因此陣列重新排序本身

7,8,25,41 
0
var a = [5,2,1,3,9,6]; 

console.log(a.sort(function(a,b){console.log(a+"," +b); return a>b;})); 

Result: 
5,2 => create array [2,5] 
5,1 => need to check 2 and 1. [2,5], [1,5] 
2,1 => push 1 before 2? isOk? => OK [1,2,5] 
5,3 => need to check 1,2 with 3 before 5 [1,2,5], [3,5] 
2,3 => push 3 after 2 and before 5 => OK [1,2,3,5] 
5,9 => [1,2,3,5,9] 
9,6 => [1,2,3,5,9], [6,9] 
5,6 => [1,2,3,5,6,9]