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