2013-11-25 255 views
0

此代碼爲什麼起作用?對數組進行排序

<!DOCTYPE html> 
<html> 
<body> 

<p id="demo">Click the button to sort the array.</p> 

<button onclick="myFunction()">Try it</button> 

<script> 
function myFunction() 
{ 
    var points = [40,100,1,5,25,10]; 
    points.sort(function(a,b){return a-b}); 
    var x = document.getElementById("demo"); 
    x.innerHTML=points; 
} 
</script> 
</body> 
</html> 

它是由W3Schools

採取我不理解的points.sort(function(a,b){return a-b});部分。

+0

我不明白'points.sort(功能(A,B){返回A-B});'一部分。 –

+1

沒有W3Schools解釋Array.sort是如何工作的? –

+1

它使用內置函數sort()根據傳遞的函數對數字進行排序,在本例中爲'function(a,b){return a-b}'。 – DrCord

回答

2

你所擁有的是comparefunction argument syntaxArray.prototype.sort,你可以使用它進行分類。它執行基於從該函數返回並the rules are如下的值排序:

  • 如果的compareFunction(A,B)小於0,排序一個比B,即一個較低折射率的第一。
  • 如果compareFunction(a,b)返回0,則相對於彼此保持a和b不變,但相對於所有不同的元素進行排序。注意:ECMAscript標準並不保證這種行爲,因此並非所有瀏覽器(例如,至少可以追溯到2003年的Mozilla版本)都尊重這一點。
  • 如果compareFunction(a,b)大於0,則將b排序爲比a更低的索引。

所以你只是回到2號的& B,其將返回究竟什麼是排序的compareFunction,(即-ve --> if a < b+ve --> if a > b0 --> if a == b)需要之間的差異。

1

當您對sort方法使用回調函數時,它將確定如何比較數組中的兩個項目。

如果值相等,回調函數應該返回0.如果第一個參數應該在第二個參數之前結束,回調應該返回一個負值,否則返回一個正值。

這裏是更具描述性的實施具有相同的結果:

points.sort(function(a,b){ 
    if (a == b) { 
    return 0; 
    } else if (a < b) { 
    return -1; 
    } else { 
    return 1; 
    } 
}); 
1

排序函數需要一個比較器功能作爲其參數。比較器功能的工作原理liek此:

  • 它比較兩個值(a和b)
  • 如果A> B,則如果A = B,則返回0
  • 如果返回一些積極
  • < b,它返回一些負數

a-b履行本合同。

例如:如果a = 40b = 100,則a-b = -60。所以a < b

1

.sort()允許您傳遞函數來定義數組如何排序。目標是返回與當前比較的兩個項目有關的正數(> = 0)或負數(< 0)。這個想法是,如果你採取a並從b減去,如果a大於b則返回一個正數,因此a將排名高於b。如果a小於b,則返回負數並且b的排名高於a

1

排序函數通過查看比較函數返回的值是否爲負值來工作。基本上,如果它是積極的,它會交換數字。如果它是負數或零,則會按順序離開它們。它會遍歷數組,直到所有對返回一個非正值。

在這種情況下:

  1. 40-100 = -60所以離開那兩個孤獨。陣列是[40,100,1,5,25,10]
  2. 100-1 = 99這樣交換。陣列是[40,1,100,5,25,10]
  3. 100-5 = 95所以交換。 [40,1,5,100,25,10]
  4. 100-25 = 75如此交換。 [40,1,5,25,100,10]
  5. 100-10 = 90如此交換。 [40,1,5,25,10,100]
  6. 重新開始。 40-1 = 39,所以換掉。 [1,40,5,25,10,100]

等等...這是相當低效的,所以它很可能在引擎蓋下,更有效率的事情正在進行,但爲了預測你的輸出,這就足夠了。

你可以寫你的排序功能,像這樣的,並得到了相同的結果:

function(a, b) { 
    if (a > b) return 1; 
    else if (a < b) return -1; 
    else return 0; 
}