我试过这种方法:
this.plans = [];
this.plansCopy = [...this.plans];
似乎它不起作用导致返回重复。
答案 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));
因为这将沿着数组对象向下进行所有操作,并备份它们-对于一般情况进行克隆。