javascript - JS中重排序方法sort()和比较函数
伊谢尔伦
伊谢尔伦 2017-04-10 15:59:54
0
4
766

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

    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做相应的动作让两个数字调换位置吗?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

reply all(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的事情。这里其实是一个常见的设计模式,策略模式。有兴趣可以去了解一下。

洪涛

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

Peter_Zhu

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

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

巴扎黑

我今天也读到这里百思不得其解,主要不明白compare函数的意思。
搜索了一番后,终于明白了,这个原来与冒泡排序(Bubble Sort)机制相关。
参考 wiki 的说法是:

冒泡排序(Bubble Sort,)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template