【发布时间】:2018-01-09 15:34:37
【问题描述】:
我在一个对象(TypeScript、Angular4、Ionic3)上存在深度复制/克隆问题,该对象还包含其他对象的列表。每当我更改副本中的子对象时,原始对象也会受到更改的影响,反之亦然。我的 REST API 给了我以下 JSON:
在这种情况下,我有两种相关的对象,还有更多但不需要更改,因此我不包括那些:
import { Declaration } from './declaration.entity';
export class Period{
constructor(
public number: number,
public status: string,
public year: number,
public month: number,
public sum: number,
public orderNumber: string,
public userId: string,
public submitDate: Date,
public comment: string,
public declarations: Declaration[]
){}
}
和
import { FileCustom } from './file.entity';
import { Period } from './period.entity';
export class Declaration{
constructor(
public id: number,
public status: string,
public name: string,
public description: string,
public amount: number,
public date: Date,
public period: Period,
public userId: string,
public files: FileCustom[],
public comment: string
){}
}
我想更改期间内的声明字段。我有一个名为句点(句点列表)的对象,我想克隆它。我需要不受影响的时期。我查看了其他一些可能的解决方案并尝试了它们:
let cloned = this.periods.map(x => Object.assign({},x));
和
let cloned = this.periods.map(x => Object.assign([],x));
来自这个话题:
Deep copy an array in Angular 2 + TypeScript
当我使用上述解决方案之一并更改副本中 句号 的注释字段时,原始文件保持不变。但是当我在句号内更改声明的注释字段时,原始文件也被更改,这是我想要防止的。如何在没有任何子代任何对原始版本的引用的情况下深度复制/克隆我的期间列表?
提前致谢。
【问题讨论】:
-
Object.assign本身并不进行完整的深度复制,它只是将属性从一个对象复制到另一个对象。如果这些属性包含其他对象,则将维护这些引用。你可能想看看What is the most efficient way to deep clone an object in JavaScript?
标签: javascript angular typescript clone deep-copy