如何在不改变原始数组的情况下对数组进行排序?

2022-08-29 23:30:01

假设我想要一个返回输入数组的排序副本的排序函数。我天真地尝试了这个

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

我用这个测试了它,这表明我的方法正在改变数组。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);
}

但它根本不起作用。

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


答案 1

在对数组进行排序之前,需要复制该数组。使用 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


答案 2

只需复制数组即可。有很多方法可以做到这一点:

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

// Or:
return Array.prototype.slice.call(arr).sort(); // For array-like objects