【发布时间】:2018-05-26 09:12:45
【问题描述】:
我试过这种方法:
this.plans = [];
this.plansCopy = [...this.plans];
似乎它不起作用导致返回重复。
【问题讨论】:
-
返回重复是什么意思?
我试过这种方法:
this.plans = [];
this.plansCopy = [...this.plans];
似乎它不起作用导致返回重复。
【问题讨论】:
展开运算符返回数组的各个项目。如果这些已经是对象,那么它会将 references 返回到这些对象。 [] 部分正在创建一个新数组。这样你就有了一个新数组,但它仍然包含相同的对象引用,所以this.plans[0].oper() 也会同时调用this.plansCopy[0].oper()。
相反,您需要克隆每个单独的对象。有很多不同的方法可以做到这一点(创建数组或单个对象的深层副本)。如果您只需要一级克隆,您可以这样做:
this.plansCopy = this.plans.map(obj => ({...obj}));
这将创建一个新数组,其中每个元素都是每个对象的副本。
【讨论】:
map(obj => ({...obj}));?你的意思是?地图(obj => ({ return obj})); ?
.map(obj => ({...obj})) 与.map(obj => { return {...obj}; }) 相同
...obj的想法不同
这很好回答here。主要问题是您可能会在数组的更深层次上遇到复制引用而不是复制引用的问题。如果你知道你只有简单的对象,你也可以使用
const newArray = Array.from(oldArray);
我发现它比扩展运算符更清晰。
但是,如果您不知道数组的复杂性有多深(即非简单类型的嵌套有多深),通用答案似乎是
this.backupData = JSON.parse(JSON.stringify(genericItems));
因为这将全部沿着数组的对象向下移动,并重新构建它们——一般情况下的克隆。
【讨论】: