2013-11-25 256 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; 
}