如何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枚举和自己的属性(如本文所回答的那样)。