JavaScript的排序(compareFunction)如何工作?

时间:2016-12-13 12:23:36

标签: javascript sorting

var arr = [5, 2, 1, -10, 8];

arr.sort(function(a, b) {
  console.log(a,b)
  return b - a;

}) ; // 8, 5, 2, 1, -10

此回调如何运作?

选择a和b的原则是什么?

请从内部解释这个特例。

输出console.log(首先请解释此输出):

  5 2
  2 1
  1 -10
 -10 8
  1 8
  2 8
  5 8

3 个答案:

答案 0 :(得分:9)

这取决于实施。这个实际的实现,看起来像insertion sort,有这么多的数据(可能与Chrome不同,不同的实现少于10个项目或更多项),从索引零到最后如果在最后两个项目中没有发生交换,则它会停止,否则它会向后转移到零指数。

基本上它按此顺序进行测试和更改

5   2   1 -10   8   original order
5   2
    2   1
        1 -10
          -10   8   swap
            8 -10
        1   8       swap
        8   1
    2   8           swap
    8   2
5   8               swap
8   5  2    1 -10   result

更复杂的排序更好地显示了正在发生的事情,有两个更大的值,需要移动到数组的另一侧

8   9   1   2   3   4   original array
8   9
    9   1               swap
    1   9
8   1                   swap
1   8
        9   2           swap
        2   9
    8   2               swap
    2   8
1   2
            9   3       swap
            3   9
        8   3           swap
        3   8
    2   3
                9   4   swap
                4   9
            8   4       swap
            4   8
        3   4
1   2   3   4   8   9   result

实例,不适用于所有用户代理(例如,不在Edge中,但在Chrome中)

var array = [8, 9, 1, 2, 3, 4];
console.log(JSON.stringify(array));
array.sort(function (a, b) {
    console.log(a , b, JSON.stringify(array));
    return a - b;
});
console.log(JSON.stringify(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:3)

带有自定义函数的

.sort()必须返回数字,表示必须将女孩项放在前面:

< 0 - 第一个元素必须放在第二个元素之前 0 - 两个元素相等,不改变顺序 > 0 - 第一个元素必须放在第一个元素之前。

通常b - a表示后代排序,而a - b表示上升排序。

使用什么算法对元素进行排序取决于.sort的浏览器实现。检查它们的比较:

enter image description here

答案 2 :(得分:0)

它会通过将该值移动到较低或较高的值来对项目进行排序。

以下是一些信息:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

  

如果提供compareFunction,则对数组元素进行排序   根据比较函数的返回值。如果a和b是   比较两个要素,然后:

     
      
  • 如果compareFunction(a,b)小于0,则将a排序为低于b的索引,即a先出现。
  •   
  • 如果compareFunction(a,b)返回0,则保持a和b相对于彼此不变,但相对于所有不同的分类   元素。注意:ECMAscript标准不保证这一点   行为,因而并非所有浏览器(例如Mozilla版本约会   回到至少2003年)尊重这一点。
  •   
  • 如果compareFunction(a,b)大于0,则将b排序为低于a的索引。
  •   
  • compareFunction(a,b)在给定一对特定元素a和b作为其两个参数时必须始终返回相同的值。如果   返回不一致的结果,然后排序顺序未定义。
  •   
     

因此,比较函数具有以下形式:

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}
  

要比较数字而不是字符串,比较功能可以简单   从a中减去b。以下函数将对数组进行排序   升序(如果它不包含无穷大和NaN):

function compareNumbers(a, b) {
  return a - b;
}