如何sorting数组而不改变原始数组?
假设我想要一个返回input数组的sorting副本的sorting函数。 我天真地尝试过这个
function sort(arr) { return arr.sort(); }
我用这个来testing它,这表明我的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); }
但它根本不起作用。
有没有一个简单的方法,这个方法不需要手动滚动我自己的sortingalgorithm或将数组的每个元素都复制到一个新的?
只需复制数组。 有很多方法可以做到这一点:
function sort(arr) { return arr.concat().sort(); } // Or: return Array.prototype.slice.call(arr).sort(); // For array-like objects
尝试以下
function sortCopy(arr) { return arr.slice(0).sort(); }
slice(0)
expression式创build从元素0开始的数组副本。
您可以使用不带参数的slice来复制数组:
var foo, bar; foo = [3,1,2]; bar = foo.slice().sort();
一个更清洁的解决scheme,非深度复制与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
我使用Object.assign()为我的大部分副本:
var copyArray = Object.assign([], originalArray).sort();
然而,在查看OP注释之后,我研究了一些深层复制,发现Object.assign不仅执行浅拷贝,而且只select枚举和自己的属性(如本文所回答的那样)。