如何克隆TypeScript对象数组?

Ali*_*ice -1 typescript typescript2.0

我尝试了这种方法:

this.plans = [];
this.plansCopy = [...this.plans];
Run Code Online (Sandbox Code Playgroud)

似乎不起作用,导致退货重复。

Exp*_*lls 6

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

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

this.plansCopy = this.plans.map(obj => ({...obj}));
Run Code Online (Sandbox Code Playgroud)

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


Ben*_*Ben 5

在这里得到了很好的回答。主要问题是您可能会遇到在数组更深层次复制引用而不是复制引用的问题。如果你知道你只有简单的对象,你也可以使用

const newArray = Array.from(oldArray); 
Run Code Online (Sandbox Code Playgroud)

我发现它比价差运算符更清晰。

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

this.backupData = JSON.parse(JSON.stringify(genericItems));
Run Code Online (Sandbox Code Playgroud)

由于这将走所有的路下来阵列的对象,并建立它们备份-克隆的一般情况。