在 Angular 2 + TypeScript 中深度复制数组

IT技术 javascript typescript angular
2021-02-04 00:42:32

我有一个作为输入的对象数组。让我们称之为content

在尝试对其进行深度复制时,它仍然具有对前一个数组的引用。

我需要复制该输入数组,并更改复制部分的一个属性。

长期以来,我尝试了不同的方法,但都没有成功。

ES6方式:

public duplicateArray() {
  arr = [...this.content]
  arr.map((x) => {x.status = DEFAULT});
  return this.content.concat(arr);
}

slice方式:

public duplicateArray() {
  arr = this.content.slice(0);
  arr.map((x) => {x.status = DEFAULT});
  return this.content.concat(arr);
}

在这两个数组中,数组内的所有对象都有status: 'Default'.

在 Angular 2 中深度复制数组的最佳方法是什么?

6个回答

检查这个:

  let cloned = source.map(x => Object.assign({}, x));
至于我source.map(x => ({ ...x }));最适合。
2021-03-21 00:42:32
如果要克隆数组对象,此选项更可取。
2021-04-01 00:42:32
经过2个小时的搜索。这有效!万分感谢!
2021-04-01 00:42:32
如果我没有遗漏一些对字符串不起作用的东西——当我尝试时,var source = ["one","two","three"]; var cloned = source.map(x => Object.assign({},x)); 我最终克隆为:[ { '0': 'o', '1': 'n', '2': 'e' }, { '0': 't', '1': 'w', '2': 'o' }, { '0': 't', '1': 'h', '2': 'r', '3': 'e', '4': 'e' } ]
2021-04-07 00:42:32
2021-04-13 00:42:32

简单的:

let objCopy  = JSON.parse(JSON.stringify(obj));

这也适用(仅适用于阵列)

let objCopy2 = obj.slice()
可能不是最有效但绝对是最简单的......并且适用于任何对象/数组
2021-03-18 00:42:32
如果对象具有函数属性或循环引用,这将不起作用。
2021-03-23 00:42:32
比 Object.assign([], this.list); 节省了我的一天 (线)
2021-03-31 00:42:32
我们在生产中使用这种方法,其中主模型中有 2 个嵌套模型,获取模型的调用工作正常,getError() 方法也工作正常
2021-04-05 00:42:32
这可能是个好主意。但是有一个但是:假设对象有方法,我认为这不会复制方法。
2021-04-12 00:42:32

这对我有用:

this.listCopy = Object.assign([], this.list);
@el.atomo 你能提供一个例子吗,因为我无法重现它
2021-03-18 00:42:32
@kabus,它会this.list包含对象。如果修改 中包含的任何对象this.list,更改将反映到 中this.listCopy,因为它只保留引用。
2021-03-21 00:42:32
@makkasi 那不是真的。设置 this.listCopy 后更改 this.list 肯定不会影响 this.listCopy !!
2021-03-28 00:42:32
好吧,可能是我错了。我用这段代码进行了测试,它改变了另一个列表。可能是其他地方的原因。我目前无法访问计算机。稍后会尝试这个。我删除了我之前的评论。
2021-04-07 00:42:32
当然@kabus, let list = [{a: 1}]; let listCopy = Object.assign([], list); list[0].a = 2; console.log(list[0].a, listCopy[0].a);对不起,格式丑陋:)
2021-04-12 00:42:32

我找到的唯一解决方案(在发布问题后几乎立即)是遍历数组并使用 Object.assign()

像这样:

public duplicateArray() {
  let arr = [];
  this.content.forEach((x) => {
    arr.push(Object.assign({}, x));
  })
  arr.map((x) => {x.status = DEFAULT});
  return this.content.concat(arr);
}

我知道这不是最佳选择。我想知道是否有更好的解决方案。

2021-04-10 00:42:32

使用 lodash 的 cloneDeep 方法来深度复制内部具有嵌套对象的对象的一种干净方法。

对于 Angular,你可以这样做:

使用yarn add lodash安装 lodash npm install lodash

在您的组件中,导入cloneDeep并使用它:

import * as cloneDeep from 'lodash/cloneDeep';
...
clonedObject = cloneDeep(originalObject);

它只增加了 18kb 到您的构建中,非常值得。

我还在这里写了一篇文章,如果您需要更深入地了解为什么使用 lodash 的 cloneDeep。

请注意,如果您的 originalObject 是一个对象数组,则不会对对象进行深度复制,而是会复制它们的引用。
2021-04-04 00:42:32