问题描述
在复习数组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 等等。
如果第一位一样,那么比较第二位,第三位,以此类推。以上述为例,很显然 2 是 2 开头的最小了;因为 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)
如需要补充,后续修改......