JavaScript复制数组到新数组

56

我想从现有数组中创建一个新的数组,以便我可以修改新数组而不影响旧数组。我知道数组是可变的,这就是为什么新数组会影响旧数组的原因。

例如:

old = ["Apples", "Bananas"];
new = old;

new.reverse();

旧的也被反转了。

在Python中,我可以只需执行new = list(old),但执行new = new Array(old);会将旧列表放入一个列表中。


在ES6中,您可以使用扩展语法例如:var arrOld = ["Apples", "Bananas"]; var arrNew= [...arrOld]; - GibboK
2个回答

111
你可以使用 .slice 方法:
var old = ["Apples", "Bananas"];
var newArr = old.slice(0);
newArr.reverse(); 
// now newArr is ["Bananas", "Apples"] and old is ["Apples", "Bananas"]

Array.prototype.slice返回数组的一部分的浅拷贝。如果将0作为第一个参数传递给它,那么你将返回所有元素的副本(从索引0开始)


14
你可以直接使用 old.slice(),因为默认情况下索引 0 会被使用。参见 slice() 文档 - Jon Onstott
这是一个很棒的半黑客。我说黑客,因为如果没有了解切片的行为方式,阅读代码时并不清楚正在发生什么。Firefox有一个array.values()方法,可以像这样复制值。不幸的是,其他浏览器不支持该方法。 - mattdevio
那种黑科技在多维数组上行不通。如果你有 var oldArr = [ [1,2], [3,4] ] 并且执行了 var newArr = oldArr.slice(0) 然后改变 newArr 中的值,例如 newArr[1][0] = 5 并检查 oldArr[0][0],你会发现它也被更新了。所以唯一的复制方法是循环遍历并逐个切片每个值。 - Joseph
@Joseph,这不是黑客攻击 - 它只是浅克隆 - 如果你想要深度克隆(JS没有多维数组的概念 - 只有数组的数组)- 你可以使用 JSON.parse(JSON.stringify(old)),尽管这很少是一个有用的事情。 - Benjamin Gruenbaum

9
尝试以下操作:
newArray = oldArray.slice(0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接