让我们假设我想要一个排序函数,它返回输入数组的排序副本。我很天真地试过

function sort(arr) {
  return arr.sort();
}

我用这个测试了一下,结果显示我的排序方法改变了数组。

var a = [2,3,7,5,3,7,1,3,4];
sort(a);
alert(a);  //alerts "1,2,3,3,3,4,5,7,7"

我也尝试过这种方法

function sort(arr) {
  return Array.prototype.sort(arr);
}

但它根本不起作用。

有没有一种直接的方法来解决这个问题,最好是一种不需要手动滚动我自己的排序算法或将数组中的每个元素复制到一个新的数组中的方法?


当前回答

在对数组排序之前,需要复制它。使用es6的一种方法:

const sorted = [...arr].sort();

扩展语法作为数组文字(复制自mdn):

var arr = [1, 2, 3];
var arr2 = [...arr]; // like arr.slice()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator

其他回答

试试下面的方法

function sortCopy(arr) { 
  return arr.slice(0).sort();
}

slice(0)表达式从元素0开始创建数组的副本。

在对数组排序之前,需要复制它。使用es6的一种方法:

const sorted = [...arr].sort();

扩展语法作为数组文字(复制自mdn):

var arr = [1, 2, 3];
var arr2 = [...arr]; // like arr.slice()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator

Update - Array.prototype.toSorted()提议

Array.prototype. tosorted (compareFn) -> Array是一个被建议添加到Array的方法。原型,目前处于第3阶段(很快就可以使用)。

此方法将保持目标Array不变,并返回它的副本,并执行更改。

试试这个来排序数字。这不会改变原始数组。

function sort(arr) {
  return arr.slice(0).sort((a,b) => a-b);
}

任何想要做深度复制的人(例如,如果你的数组包含对象)可以使用:

let arrCopy = JSON.parse(JSON.stringify(arr))

然后你可以在不改变arr的情况下对arcopy进行排序。

arrCopy.sort((obj1, obj2) => obj1.id > obj2.id)

请注意:对于非常大的数组,这可能会很慢。