如何克隆对象数组TypeScript?

时间:2017-12-12 16:01:54

标签: typescript typescript2.0

我试过这种方法:

this.plans = [];
this.plansCopy = [...this.plans];

似乎它不起作用导致返回重复。

2 个答案:

答案 0 :(得分:5)

spread运算符返回数组的各个项。如果这些已经是对象,那么它会将引用返回给那些对象。它是创建新数组的[]部分。因此,您有一个新数组,但它仍然包含相同的对象引用,因此this.plans[0].oper()也会同时调用this.plansCopy[0].oper()

相反,您需要克隆每个单独的对象。有很多不同的方法可以做到这一点(创建数组或单个对象的深层副本)。如果您只需要一级克隆,您可以这样做:

this.plansCopy = this.plans.map(obj => ({...obj}));

这将创建一个新数组,其中每个元素都是每个对象的副本。

答案 1 :(得分:1)

here这是一个很好的答案。主要问题是,在数组的更深层次上,可能会出现复制的问题,而不是复制。如果您知道只有简单的对象,则也可以使用

const newArray = Array.from(oldArray);

我发现它比点差运算符更清楚。

但是,如果您不知道数组的复杂性有多深(即您可能有一个非简单类型的嵌套深度),通用答案似乎就是

this.backupData = JSON.parse(JSON.stringify(genericItems));

因为这将沿着数组对象向下进行所有操作,并备份它们-对于一般情况进行克隆。