修复 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' ]
相关文章
有用资源
javascript 参考教程 - 该教程包含有关 javascript 的更多信息:https://www.cainiaomax.com/javascript/

