【发布时间】:2017-01-23 05:09:25
【问题描述】:
请帮助我使用 Angular 2 将对象复制到另一个对象中?
在 Angular 中,我使用 angular.copy() 将对象复制到旧对象的松散引用。但是,当我在 Angular 2 中使用相同时,出现以下错误:
错误:未定义角度。
【问题讨论】:
标签: angular typescript
请帮助我使用 Angular 2 将对象复制到另一个对象中?
在 Angular 中,我使用 angular.copy() 将对象复制到旧对象的松散引用。但是,当我在 Angular 2 中使用相同时,出现以下错误:
错误:未定义角度。
【问题讨论】:
标签: angular typescript
解决方案
Angular2 是在 TypeScript 和 ES6 等现代技术的基础上开发的。
所以你可以做let copy = Object.assign({}, myObject)。
Object assign - 很好的例子。
对于嵌套对象:
let copy = JSON.parse(JSON.stringify(myObject))
【讨论】:
let copy = Object.assign({}, myObject). as mentioned above
但这不适用于嵌套对象。所以另一种选择是
let copy =JSON.parse(JSON.stringify(myObject))
【讨论】:
let course = {
name: 'Angular',
};
let newCourse= Object.assign({}, course);
newCourse.name= 'React';
console.log(course.name); // writes Angular
console.log(newCourse.name); // writes React
对于嵌套对象,我们可以使用 3rd 方库来深度复制对象。 如果是 lodash,请使用 _.cloneDeep()
let newCourse= _.cloneDeep(course);
【讨论】:
如前所述,深层复制具有嵌套对象的对象的干净方法是使用 lodash 的 cloneDeep 方法。
对于 Angular,您可以这样做:
使用yarn add lodash 或npm install lodash 安装lodash。
在您的组件中,导入 cloneDeep 并使用它:
import * as cloneDeep from 'lodash/cloneDeep';
...
clonedObject = cloneDeep(originalObject);
它只增加了 18kb 到您的构建中,非常值得。
我还写了一个article here,如果您需要更深入地了解为什么要使用 lodash 的 cloneDeep。
【讨论】:
您可以使用扩展运算符在 Angular 中使用 ECMAScript6 执行此操作:
let copy = {...myObject};
【讨论】:
Loadsh 是用于处理任何对象深拷贝的通用标准库。这是一个递归算法。它检查所有内容并为给定的对象进行复制。编写这种算法需要更长的时间。最好利用相同的。
【讨论】:
试试这个。
复制一个数组:
const myCopiedArray = Object.assign([], myArray);
复制一个对象:
const myCopiedObject = Object.assign({}, myObject);
【讨论】:
Object.assign 仅适用于单级对象引用。
要进行任何深度的复制,请使用如下:
let x = {'a':'a','b':{'c':'c'}};
let y = JSON.parse(JSON.stringify(x));
如果想使用任何库,请使用 loadash.js 库。
【讨论】:
谢谢你上面的赛义夫。我尝试了他的建议,在我尝试了三天让我的代码工作之后,它就像一个魅力。
this.sElectionFinal.subscribe((election) => {
const electionCopy = Object.assign({},election)
this.electionsFinal.push(electionCopy)})
【讨论】: