对数字数组进行排序

时间:2013-11-25 22:50:40

标签: javascript arrays sorting

为什么这段代码有效?

<!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});部分。

5 个答案:

答案 0 :(得分:2)

您所拥有的comparefunction argument syntax Array.prototype.sort可以用来进行海关操作。它根据您从此函数返回的值和the rules are执行排序,如下所示:

  • 如果compareFunction(a,b)小于0,则将a排序为低于b的索引,即a先出现。
  • 如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但是对所有不同的元素进行排序。注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点。
  • 如果compareFunction(a,b)大于0,则将b排序为低于a的索引。

所以你只是返回两个数字之间的区别a&amp; b将完全返回compareFunction排序所需的内容(即-ve --> if a < b+ve --> if a > b0 --> if a == b)。

答案 1 :(得分:1)

当您使用sort方法的回调函数时,它会确定如何比较数组中的两个项目。

如果值相等,则回调函数应返回0.如果第一个参数应在第二个参数之前结束,则回调应返回负值,否则返回正值。

以下是具有相同结果的更具描述性的实现:

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

答案 2 :(得分:1)

sort函数将比较器函数作为其参数。比较器功能起作用:

  • 它比较两个值(a和b)
  • 如果a&gt; b,它返回正面的东西
  • 如果a = b,则返回0
  • 如果&lt; b,它返回负面的东西

a-b履行了这份合同。

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

答案 3 :(得分:1)

.sort()允许您传递一个函数来定义数组的排序方式。目标是相对于当前比较的两个项目返回正(&gt; = 0)或负数(&lt; 0)。我们的想法是,如果您a并从b减去,如果a大于b,则返回肯定,因此a将排名更高比b。如果a小于b,则会返回否定,并且b的排名高于a

答案 4 :(得分:1)

sort函数通过查看比较器函数返回的值是负还是正来工作。基本上,如果它是正面的,它会交换数字。如果是负数或零,则按顺序保留它们。它不断遍历数组,直到所有对返回非正值。

在这种情况下:

  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]
  7. 依此类推......这是相当低效的,所以很可能在幕后,一些更高效的事情正在发生,但为了预测你的输出,这就足够了。

    您可以像这样编写排序函数并获得相同的结果:

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