JS的sort方法排序出现错误

321 阅读2分钟

问题描述

在复习数组API的过程中,使用 sort 给数组排序,但是输出的结果不太正确。(下面截取部分代码)

let array = [2,444,56,745,34,56,677,45]  //使用sort默认排序
res = array.sort()   //[2, 34, 444,  45,56, 56, 677, 745]

在这里就感到很奇怪了 ,就只有 444 排序出错,其他的顺序都是正确的。

产生原因

因为 sort() 方法还有回调函数,没有传递这个参数的时候,会触发 sort()默认行为。它的默认行为就是会调用数组中每一项的toString()方法,然后按照unicode编码进行排序,如果数组含有undefined元素,它们将会被排到尾部。省略了回调函数,所有的数字都会变为字符串,然后按照字符串的比较大小进行比较,也就是 unicode 编码比较。

这里我们输出的结果是:[ 2, 34, 444, 45,56, 56, 677, 745 ]

因为在 unicode 编码中 1 开头的最小,其次是 2,3,4,5 等等。

如果第一位一样,那么比较第二位,第三位,以此类推。以上述为例,很显然 22 开头的最小了;因为 444 开头 4 小于 5, 所以56 排在 444 后面,后面就可以以此类推。

解决方法

原来是因为 sort() 方法还有回调函数,如果省略了回调函数,那么就有可能出错。如果要确保排序结果的准确,就要给 sort() 加上参数 (升序或者降序)

修改之后可以看到问题已经解决了(如下)

res = array.sort((a,b)=>{
    return a-b
})
console.log(res);  // [ 2, 34, 45, 56,56, 444, 677, 74 ]

拓展

升序

写成 a-b ,前面数字减去后面数字。

array.sort((a,b)=> a-b)

降序

写成 b-a,后面数字减去前面数字。

arr.sort((a,b)=> b-a)

如需要补充,后续修改......