JS中Array.prototype.sort()方法详解

sort()方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的

如果sort函数中没有参数的话,那么按照定义元素会按照转换为的字符串的诸个字符的 Unicode 位点进行排序。例如 "Banana" 会被排列到 "cherry" 之前,而比较的数字会先被转换为字符串,所以在 Unicode 顺序上 "80" 要比 "9" 要靠前。

为了按照其他方式(比较数字)而非字母表顺序进行排序,我们可以在调用sort方法的时候,传入一个回调函数(compareFn),从而改变 sort 方法的排序方式。

下面为sort方法的示例:

const num = [4, 20, 5, 1, 3];

num.sort();
console.log(num);// Expected output:[1, 20, 3, 4, 5]

num.sort((a, b) => a - b);
console.log(num);// Expected output:[1, 3, 4, 5, 20]

num.sort((a, b) => b - a);
console.log(num);// Expected output:[20, 5, 4, 3, 1]

在这有一个问题,为什么上面返回 a - b 就是升序,返回 b - a 就是降序了呢?

如果指明了compareFn ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:

compareFn(a, b) 返回值 排序顺序
> 0 a 在 b 后
< 0 a 在 b 前
=== 0 保持 a 和 b 的顺序

所以,

当 a>b 时,

a - b > 0  ,排序结果 ===> b,a (升序)

b - a < 0  ,排序结果 ===> a,b (降序)

当 b>a 时,

a - b < 0  ,排序结果 ===> a,b (升序)

b - a > 0  ,排序结果 ===> b,a (降序)

当 a=b 时,

a - b = b - a =0 , 排序结果 ===> 保持不变

由此看出,无论a>b还是b>a,return a-b 总能得到升序的结果,而 return b-a 总能得到降序的结果。

猜你喜欢

转载自blog.csdn.net/qq_42691298/article/details/129162742