JS中重排序方法sort()和比较函数

想要按照从小到大的顺序排列

    var numbers = [0,1,5,10,15];
    numbers.sort();
    console.log(numbers);

打印出来是0,1,10,15,5
书中说的是字符串比较下,10在5的前面,这是怎么比较的???

    function compare(a,b) {
         if (a < b) {
             return -1;
         }else if(a > b) {
             return 1;
         }else{
             return 0;
         }
     }
     numbers.sort(compare);
     console.log(numbers);

比较函数作为参数传递给sort()之后,是怎么让2个数字换位置排列的?不清楚调换位置的动作是哪行代码执行的,难道是sort()本身可以对返回值1,-1, 0做相应的动作让两个数字调换位置吗?

阅读 10.2k
4 个回答
  1. 关于第一次排序的结果

为什么数组 [0,1,5,10,15].sort() 之后的结果是 0,1,10,15,5,而不是期待的 0,1,5,10,15
这是因为 sort 方法默认(即没有compare函数)按照数组元素对应的字符串的 Unicode 从小到大进行排序。
也就是说,上面的结果中5排在10,15后面,是因为 '5' 比 '10','15'大。
你现在就可以按F12打开console,输入下面的代码

'5' > '10'

结果应该是true。这说明,字符串 '5' 比 '10' 大,所以它排在后面。

  1. 关于compare函数

compare函数只是指定了 排序策略 ,sort 会根据这个策略来排序。 至于怎么调换位置,怎么生成最后的结果,那是sort的事情。这里其实是一个常见的设计模式,策略模式。有兴趣可以去了解一下。

JS高级程序设计?哈哈,刚好前段时间看了这个。
问题1上面已经解答了,我补充一下问题2。

compare作为sort()的参数返回三个结果:0、1、-1。即0、正数、负数。就像你说的“sort()本身可以对返回值1,-1, 0做相应的动作让两个数字调换位置”,这里是sort()得到的参数为正数时才交换两个值的顺序,否则不交换

位置互换是在sort内部执行的,传入的compare参数只是(一个返回1,-1, 0的)函数而已,compare返回值是在sort内部被使用的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏