修复 JavaScript 中 .sort() 方法的问题,两个数组排序而不是只有一个数组

javascriptweb developmentobject oriented programming更新于 2025/9/25 8:12:17

Array.prototype.sort() 函数的一个属性是它是一种就地排序算法,这意味着它不会创建要排序的数组的新副本,它会对数组进行排序而不使用任何额外空间,从而使其更高效、性能更好。但这种特性有时会导致尴尬的情况。

让我们通过一个例子来理解这一点。假设,我们有一个包含一些字符串文字的 names 数组,我们希望保持此数组的顺序不变,并希望另一个数组包含与 names 数组相同的元素,但按字母顺序排序。

我们可以这样做 −

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = names;
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

但正如我们在 JavaScript 中所知,数组也是对象,对象是通过引用而不是值复制的,因此对一个数组进行排序会导致对两个数组进行排序,这显然是我们不希望看到的。

解决方案

1. 初始化新数组时使用slice()

示例

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = names.slice();
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

slice() 方法实际上返回一个浅拷贝,复制到与之一起使用的数组的新数组中,如果没有提供参数,它会从头到尾复制。

虽然这种方法效率不高,因为它包括初始化新数组,并且只对字符串/数字文字数组有效,但第二种方法效率更高,并且也适用于对象数组。

2. 使用 JSON.stringify() / JSON.parse()

示例

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = JSON.parse(JSON.stringify(names));
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

将数组转换为 JSON 字符串,然后再转换为数组,会强制编译器不通过引用进行复制。

两种方法的输出在控制台中相同−

输出

[ 'Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj' ]
[ 'Anshul', 'Dheeraj', 'Mukesh', 'Rakesh', 'Ram' ]

相关文章


有用资源