【问题标题】:change in original array if I change the copied one [duplicate]如果我更改复制的数组,则更改原始数组[重复]
【发布时间】:2021-01-18 05:58:23
【问题描述】:

又是一个令人困惑的问题:

这里我将数组复制到另一个变量中,我希望当我在另一个变量中更改某些内容时不会更改原始数组但是两个数组都更改了为什么?

 const groups = [[1, 2, 3, 4 ,5], [2,3]];
 const sets = [...groups];
 
 sets[1].push(9000); // I just push a number into sets NOT groups
 
 console.log(sets);
 console.log(groups); 
 

只有当我们有一个数组时才会发生这种情况!

我缺少什么以及如何解决这个问题?

【问题讨论】:

  • 展开语法执行浅拷贝,而不是拷贝。复制数组中的数组仍然引用groups 数组中的相同数组。
  • 等等....什么?那我该怎么办...
  • 如果它只是一个二维数组,你可以做类似const sets = groups.map(arr => [...arr]) 这样的操作,这将克隆每个内部数组,并将存储在 .map() 生成的结果外部数组中。

标签: javascript arrays


【解决方案1】:

展开运算符只对组进行浅拷贝。所以数组是通过引用复制的,如果你改变了这些,原来的数组就会受到影响。

编辑:如果你需要一个深度克隆,你可能想看看这里: Deep copy in ES6 using the spread syntax(JSON.stringify/JSON.parse 应该阻止另一个 3rd 方库)。

【讨论】:

  • 有趣 - 这与尼克·帕森斯的评论几乎相同......
  • 应该怎样做才能不影响原数组?
  • 深度克隆,我已经附上了一个链接到一个副本,它应该指向正确的答案
  • 巧合的是,我昨天刚刚发布了一个与之密切相关的答案:stackoverflow.com/a/64158339/12984567
猜你喜欢
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2021-12-28
  • 2021-06-09
相关资源
最近更新 更多