JavaScript 数组 sort() 方法

JavaScript sort() 语法

sort() 是 JavaScript 数组的一个方法,它用于对数组元素进行排序(升序或降序)。

语法:

arr.sort(compareFn)

说明:

sort() 方法可以接收单个参数。

  • compareFn(可选):它是一个自定义函数,数组会根据这个函数来判断是升序还是降序。

如果省略 compareFn 参数,则会执行以下步骤。

  • 将所有元素转换为字符串。
  • 使用这些字符串的 Unicode 码位值进行比较,然后按升序排列。
  • undefined 元素会被移动到数组的末尾。

如果提供 compareFn 参数,它应该接受两个参数 a 和 b,表示要比较的两个元素。

  • 如果 compareFunction(a, b) 返回一个负数,表示 a 应该排在 b 之前。
  • 如果 compareFunction(a, b) 返回一个正数,表示 a 应该排在 b 之后。
  • 如果 compareFunction(a, b) 返回 0,表示 a 和 b 的相对位置不变(但一些浏览器可能会改变)。

sort() 方法是有返回值的,也就是返回排序后的数组。也就是说,它返回的是调用该方法的同一个数组实例。

注意: sort() 是一个 “破坏性” 方法,它会改变原数组。如果你不希望修改原数组,应该使用 ECMAScript 2023 新增的 toSorted() 方法来代替 sort() 方法。

JavaScript sort() 摘要

属于 JavaScript Array 对象
使用频率
修改原数组
官方文档 查看
MDN 查看

JavaScript sort() 示例

接下来,我们通过几个简单的例子来讲解一下 JavaScript sort() 方法是如何使用的。

示例 1:sort() 实现升序

function fn (a, b) {
    return a - b;
}
const arr = [3, 9, 1, 12, 50, 21];
arr.sort(fn);
console.log(arr);

运行结果如下。

[ 1, 3, 9, 12, 21, 50 ]

分析:

如果想要使用 sort() 方法来实现升序,我们可以认为上面 fn 的写法是固定的。这样定义之后,sort() 方法就会自动实现升序。

sort() 方法本质上是一个高阶函数。所谓的高阶函数,指的是一个函数的参数又是一个函数。在实际开发中,我们更推荐使用 “箭头函数” 的方式书写 sort() 的回调函数。下面两种方式是等价的。

// 方式1:不使用箭头函数
arr.sort(function(a, b) {
    return a - b;
});

// 方式2:使用箭头函数
arr.sort((a, b) => a - b)

示例 2:sort() 实现降序

function fn (a, b) {
    return b - a;
}
const arr = [3, 9, 1, 12, 50, 21];
arr.sort(fn);
console.log(arr);

运行结果如下。

[ 50, 21, 12, 9, 3, 1 ]

示例 3:sort() 不带参数

const arr = [3, 9, 1, 12, 50, 21];
arr.sort();
console.log(arr);

运行结果如下。

[1, 12, 21, 3, 50, 9]

分析:

如果 sort() 方法不带参数,那么所有非数组类型的元素,在排序之前都会转换为字符串,然后再按升序排列。这里可以看到,即使 21 在数字上大于 3,但 3 也排在 21 的后面,这是因为 "2" < "3"。因此在实际开发中,当使用 sort() 方法对数字进行排序时,我们必须始终提供比较函数,而不能依赖默认行为。

如果不希望 sort() 方法修改原数组,我们可以使用下面两种方式。

  • ES6 解构赋值。
  • ECMAScript 2023 新增的 toSorted() 方法。

示例 4:sort() 结合 ES6 解构赋值

function fn (a, b) {
    return a - b;
}
const arr = [3, 9, 1, 12, 50, 21];
const result = [...arr].sort(fn);

console.log(arr);
console.log(result);

运行结果如下。

[ 3, 9, 1, 12, 50, 21 ]
[ 1, 3, 9, 12, 21, 50 ]

示例 5:使用 toSorted() 代替 sort()

function fn (a, b) {
    return a - b;
}
const arr = [3, 9, 1, 12, 50, 21];
const result = arr.toSorted(fn);

console.log(arr);
console.log(result);

运行结果如下。

[ 3, 9, 1, 12, 50, 21 ]
[ 1, 3, 9, 12, 21, 50 ]

分析:

从结果可以看出,toSorted() 是一个 “非破坏性” 方法,它不会修改原数组,然后会返回排序后的数组。

“破坏性” 方法 vs “非破坏性” 方法

在 JavaScript 中,数组的 “破坏性” 方法以及它们对应的 “非破坏性” 方法,总结如下表所示。

破坏性方法 vs 非破坏性方法
破坏性 非破坏性 说明
reverse() toReversed() 反转数组
sort() toSorted() 数组排序
splice() toSpliced() 修改数组(添加、删除或替换元素)
arr[i] = val(索引赋值) with() 替换数组某个元素

上一篇: reverse()

下一篇: splice()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号