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() 替换数组某个元素

上一篇:

下一篇:

给站长反馈

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

邮箱:lvyenet@vip.qq.com

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