我不明白为什么数字排序功能在Javascript中工作

时间:2014-02-08 21:56:07

标签: javascript arrays sorting

我知道.sort()方法按字母顺序对数组进行排序,就好像它是一个字符串一样。即使你的阵列完全由数字组成。

我也理解用数字排序数组,代码是:

myArray.sort(function (a,b) {
    return a-b;
});

问题是我不明白为什么这样做。我写的函数应该带两个参数,'a'和'b',但这些参数来自哪里?阵列?怎么知道这样做?然后,该函数返回一些数字。如果'a'和'b'分别是10和5,我的函数将返回'5'。现在我正在做myArray.sort(5);怎么这么奇怪地把我的整个数组按数字排序???

感谢您的帮助。

7 个答案:

答案 0 :(得分:5)

  

我写的函数应该带两个参数,'a'和'b',但这些参数来自哪里?

要确定数组元素所属的顺序,Array.sort函数会从数组中选取元素对,并将它们作为ab传递到比较函数中。你的函数返回的结果决定了两个元素放在哪个顺序 - 如果它是否定的,那么它知道在a之前放置b;如果是肯定的,它知道a放在b之后。实际数字并不重要,只是它是负面还是正面。

编写示例的方式可能比较简单:

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

myArray.sort(myComparisonFunction);

答案 1 :(得分:3)

sort函数通过(巧妙地)比较数组条目对进行操作。根据比较结果,它知道特定值对的顺序。怎么知道的?因为它信任sort回调函数返回

  • -1如果第一个条目应该在第二个条目之前;
  • 1如果第二个条目应该在第一个条目之前;
  • 0如果条目相同(意味着订单无关紧要 *

通过反复比较数组条目对,并系统地这样做,sort函数最终根据比较器函数强加的固有规则确定整体正确的排序。

JavaScript排序实现使用的系统过程的性质未指定。现在的JavaScript运行时使用了相当优化的quicksort

,这是一个不错的选择

* 当根据比较函数,数组中的两个条目相等时,可能会发生两件事:sort函数可能会按照它们最初的顺序保留它们出现了,或者它可以交换它们。通过排序过程的简单逻辑,这些操作中的任何一个都可以;如果你正在对一个名单进行排序,而“托马斯”出现两次,那么哪个“托马斯”是第一个并且哪个是第二个并不重要,因为字符串是相同的并且难以区分。但是,如果排序比较器函数从对象对中提取属性,则有时确实重要的是,如果条目的比较返回0,则条目保持原始顺序。一种排序函数,可确保将行为称为稳定。规范是否未定义JavaScript实现是否稳定。

答案 2 :(得分:1)

Array.sortES5 spec.MDN)中使用的此比较器函数应返回数字,其中..

  • 如果a&lt; b,返回小于0
  • 如果a&gt; b,返回大于0
  • else(a == b)返回 0

所以,让我们看看一些案例:

a     b     a-b    meaning (see above)
----  ----  ----   ------
10    5     5      "a > b"
5     10    -5     "a < b"
5     5     0      "a == b" 

比较器函数定义了Comparison Sort algorithm中使用的元素之间的排序

  

比较排序是一种排序算法,它只通过单个抽象比较操作(通常是“小于或等于”运算符或三向比较[又名“比较器”])来读取列表元素两个元素中的哪一个应该首先出现在最终的排序列表中。

(注意:按Array.sort排序保证为stable。)

答案 3 :(得分:1)

  

现在我正在做myArray.sort(5);

那不是真的。传入(有时)返回5的函数与传入5完全不同。

当你需要知道两个值中哪一个应该被认为更大时,你传入sort可以调用的函数。 sort将向该函数传递两个参数。如果函数返回负值,则表示“第一个参数小于第二个参数”;如果它返回零,则表示“两个参数应该被视为相等”;如果它返回正值,则表示“第一个参数大于第二个参数”。 (这可能看起来有点苛刻和随意 - 也许是 - 但它在C语言中有很长的历史。)因此,对于数字比较,返回a-b很方便,因为它符合这些要求

请注意,您无法准确预测哪些比较sort将决定执行,因此您需要确保传入一致行为的函数。例如,如果你的函数说1小于2而2小于3,那么你的函数也需要说2大于1,3大于2,1小于3, 3大于1.否则,您可能会得到随机看似的结果。

(顺便说一下,你可能对the MDN page on Array.prototype.sort感兴趣。它提供了许多其他例子,可能有助于为你澄清这一点。)

答案 4 :(得分:1)

因此它运行并应用它想要的任何算法来对数组中的值进行排序。它需要知道的是如何判断哪一个“更大”或哪一个应该向前索引。

我想对javascript如何运作更熟悉是有帮助的。使用javascript,您可以将变量指定为函数,因此您可以将函数作为参数传递。它在这样的情况和异步回调中派上用场(如果你玩过jquery,你很可能在ajax调用中看到了这个,并且在完成各种转换之后它们被调用了...就像你想要一个元素一样移动500px然后一旦完成它你将它向下移动500px,你将向下移动功能放回到回调中)。

长话短说,a和b值来自你的数组,它拉出的值取决于sort函数。

关于sort的比较函数的一个很棒的事情就是说你有一个看起来像这样的对象:

sales:[{sale:{"brand":"Nike", "person":"Eric", "total":5000}}, {sale:{...}}]

你可以使用排序功能按品牌排序,然后像这样总计:

sales.sort(function(a,b){
    if (a.brand==b.brand){
       return a.brand>b.brand ? 1 : -1;
    } else {
       return a.total-b.total;
});

我倾向于认为这样的东西真的很整洁......它让语言使用它感觉使用的最有效的排序算法,你所要做的就是向它展示如何判断一个人是否比另一个“更大”

答案 5 :(得分:0)

a和b数组中的两个连续值进行比较 和减法可以是0,小于零和大于零.. 如果大于零,则表示先前元素较大,因此需要进一步向下推 如果它小于零,则意味着它不需要被推下..

答案 6 :(得分:0)

在您的示例中,您没有执行myArray.sort(5);,因为您传递了一个函数(用于指导排序算法),而不是数字。