【问题标题】:Copy array of Objects in angular 2以角度 2 复制对象数组
【发布时间】:2019-01-05 12:01:01
【问题描述】:

我有两个名为“persons”和“persons2”的数组, 'persons2' 数组将是 'persons' 数组的副本, 但问题是当我复制它时,我想改变第二个数组,第一个数组也在改变。这是我的代码:

  export class AppComponent {

  persons = [
    {
      name:'David',
      lname:'Jeu'
    }
  ];

  persons2=[...this.persons];

  constructor(){
      console.log(this.persons[0]);
      this.persons2[0].name='Drake';
      console.log(this.persons[0]);

      console.log(this.persons2[0]);
  }

}

【问题讨论】:

  • 在这里与所有其他问题重复...

标签: javascript arrays angular javascript-objects angular-arrays


【解决方案1】:

但问题是当我复制它时,我想更改第二个 数组,第一个数组也在变化

这是因为两个数组中的对象共享相同的引用。要执行深层复制,请尝试以下操作:

let persons2 = person.map(x => Object.assign({}, x));

或者

let person2 = JSON.parse(JSON.stringify(person));

【讨论】:

  • 谢谢它的工作,但为什么这段代码不起作用? person2=[...this.persons];
  • @Jack 那是因为 person 和 person2 中的对象共享相同的引用。因此,在一个中所做的更改将反映在另一个中。
  • 我做到了:)。我正在观看这个 youtube 教程:youtube.com/watch?v=1tRLveSyNz8,在 2:07:00 他和我一样做了同样的事情,这对他有用。你能给我解释一下吗?
  • @Jack 肯定会喜欢 :-)
  • @Jack 请在视频中进一步移动该指南已经提到,对新“阵列”的添加和删除操作不会反映在旧阵列中。但是新数组和旧数组中的现有对象保持不变。在您的情况下,如果您在 person2 两个数组中添加/删除一个对象,它将不会从 person 数组中添加/删除。
【解决方案2】:

在您的情况下,两个数组都引用相同的内存,这通常称为浅拷贝。

您可以制作第一个数组的深层副本,然后更改第二个数组。这对第一个阵列没有影响。

let persons = [{
  name: 'David',
  lname: 'Jeu'
}];

let persons2 = JSON.parse(JSON.stringify(persons));
persons2[0].age = 29;

console.log(persons)
console.log(persons2)

【讨论】:

    【解决方案3】:

    对于这些类型的操作,通常使用Lodash Clonedeep 是明智的

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2021-05-12
      • 2018-04-15
      • 2017-08-29
      • 2018-03-20
      • 1970-01-01
      • 2016-11-14
      • 2018-12-11
      • 2014-11-03
      相关资源
      最近更新 更多