关于javascript中数组排序方法的混淆点

时间:2017-02-07 11:37:23

标签: javascript arrays

我想知道当一个自定义排序函数如下所示时,javascript数组排序方法是如何工作的:

arr = [1, 5, 122, 12];
arr.sort(function (a,b){return a-b;});

如果它只接受" arr"中的两个参数a,b(1,5),我知道javascript允许的参数多于函数中指定的参数。但是如何排序函数,它比较1,5然后122,12,将结果存储在一个地方然后重做比较。

2 个答案:

答案 0 :(得分:2)

  

指定自定义排序功能时

这不正确。您提供a function to compare items

arr.sort()
arr.sort(compareFunction)
     

compareFunction

     

指定定义排序顺序的函数。如果省略,   数组根据每个字符的Unicode代码点进行排序   值,根据每个元素的字符串转换。

排序算法本身在本机实现中是硬编码的,无法更改。实现甚至可以根据数据类型或数组长度选择不同的算法。

理由是您可能有不同的需求:

  • 您可能希望使用二进制排序规则并使Aa不同,或者您可能希望使用西班牙语排序规则并使aá相同。

  • 您可能想要对自定义对象进行排序:

    [
        {
            city: "Madrid",
            population: 4000000
        },
        {
            city: "Cairo",
            pages: 15000000
        }
    ]
    
  • 或者您可能希望对水果进行排序并让pearapple之前出现:)

但是,排序算法本身(quicksort等)是一个实现细节,通常对您的业务逻辑无关紧要。

答案 1 :(得分:0)

MDN documentation

对此进行了详细解释
  • 如果compareFunction(a,b)小于0,则将a排序为低于b的索引,即a先出现。
  • 如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但是对所有不同的元素进行排序。
  • 如果compareFunction(a,b)大于0,则将b排序为低于a的索引。

所以与两个以上的论点无关。

如果您询问它与它们进行比较的顺序,则由实施决定。您可以在函数中找到它执行console.log:



arr = [1, 5, 122, 12];
arr.sort(function (a,b){console.log('Comparing a:', a, 'and b:', b); return a-b;});