【问题标题】:Javascript copy array to new array [duplicate]Javascript将数组复制到新数组[重复]
【发布时间】:2013-03-21 06:53:36
【问题描述】:

我想从现有数组中形成一个数组,这样我就可以在不影响旧数组的情况下修改新数组。我意识到数组是可变的,这就是新数组影响旧数组的原因。

例如

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

new.reverse();

旧的也被颠倒了。

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

【问题讨论】:

  • 在 ES6 中你可以使用扩展语法示例:var arrOld = ["Apples", "Bananas"]; var arrNew= [...arrOld];

标签: javascript


【解决方案1】:

您可以使用.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 开始)

【讨论】:

  • 你可以只使用old.slice(),因为 0 是默认值。见slice() docs
  • 这是一个很棒的半破解。我说 hack 是因为在不了解 slice 行为方式的情况下阅读代码时并不清楚发生了什么。 Firefox 有一个array.values() 方法,它可以像这样复制值。不幸的是,没有其他浏览器支持该方法。
  • 该 hack 不适用于多维数组。如果你有var oldArr = [ [1,2], [3,4] ] 并且做了var newArr = oldArr.slice(0) 然后用newArr[1][0] = 5 更改newArr 并检查oldArr[0][0] 你会注意到它也会被更新。所以唯一的方法是复制和循环并切片每个值
  • @Joseph 这不是 hack - 它是浅克隆 - 如果你想要一个深度克隆(JS 没有多维数组的概念 - 只是数组的数组) - 你可以 JSON.parse(JSON.stringify(old)) 虽然这很少有用的事情。
【解决方案2】:

试试下面的

newArray = oldArray.slice(0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 2011-05-14
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    相关资源
    最近更新 更多