Array.sort()

sort()

ES6 中的 Array.prototype.sort() 方法有以下几个特点:

1、原地排序:sort() 方法会在原数组上进行排序,而不是创建一个新的排序后的数组。

2、默认的排序顺序是按照字符串的 Unicode 码点顺序:如果在 sort() 方法中没有提供比较函数,那么数组元素会先被转换为字符串,然后再按照字符的 Unicode 码点顺序进行排序。例如,数字数组 [10, 2, 11] 会被排序为 [10, 11, 2]

3、可以接受一个比较函数作为参数:你可以提供一个比较函数来自定义排序顺序。比较函数应该接受两个参数,返回一个负数、零或正数,来表示第一个参数应该排在第二个参数的前面、与第二个参数相等或后面。

4、稳定排序:从 ES2019 开始,Array.prototype.sort() 是稳定的。这意味着如果两个元素相等,它们的原始顺序会被保留

我一直对这个方法有误解,我以为sort((a,b) => a-b),参数为负数表示倒序,参数为正表示顺序。 实则不然,它确定排序的方法在于a,b。

在 sort() 方法的比较函数 ((a, b) => a - b) 中,a 和 b 是数组中的两个元素。

当 sort() 方法执行排序时,它会遍历数组,每次选择两个元素,然后传递给比较函数。比较函数的任务是决定这两个元素的顺序。

例如,如果你有一个数组 [3, 1, 4] 并且你调用 sort((a, b) => a - b),那么在排序过程中,a 和 b 可能会是 (3, 1) 或者 (1, 4) 等等。

比较函数的返回值决定了 a 和 b 的排序顺序:

如果比较函数返回一个小于 0 的值,那么 a 会被排在 b 的前面。
如果比较函数返回 0,那么 a 和 b 的顺序不变。
如果比较函数返回一个大于 0 的值,那么 b 会被排在 a 的前面。
所以在 ((a, b) => a - b) 中,如果 a 小于 b,那么返回值是负数,a 会被排在 b 的前面,这就实现了升序排序。

结论是:b-a降序, a-b升序
a-b时,if a-b>0, b排前面,升序;if a-b<0, a排在前面,升序。
b-a时,if b-a>0, b排前面,降序;if b-a<0, a排在前面,降序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let arr2 = [8,1,5,9,3,4,2,6,7]
console.log(arr2.sort((a,b)=>b-a))
// [9, 8, 7, 6, 5, 4, 3, 2, 1]

let arr2 = [1,8,5,9,3,4,2,6,7]
console.log(arr2.sort((a,b)=>b-a))
// [9, 8, 7, 6, 5, 4, 3, 2, 1]


let arr2 = [8,1,5,9,3,4,2,6,7]
console.log(arr2.sort((a,b)=>a-b))
//[1,2,3,4,5,6,7,8,9]

let arr3 = [1, 8, 5, 9, 3, 4, 2, 6, 7]
console.log(arr3.sort((a, b) => a - b))
//[1,2,3,4,5,6,7,8,9]