【发布时间】:2020-02-25 13:30:06
【问题描述】:
我有一个像data.edit.lstAnnotation.lstComments 这样结构的对象
...
lstAnnotation?: AnnotationInterface;
...
export interface AnnotationInterface {
lstComments: CommentList;
}
export class CommentList {
[key: string]: CommentEntity;
}
...
据我了解,Object.assign() 函数会进行浅拷贝。这意味着不会复制内容并保留引用。我有一个类似的功能
Object.keys(this.data.edit.lstAnnotation.lstComments).map((key: string) => {
const newEntity = {...this.data.edit.lstAnnotation.lstComments[key]};
delete newEntity.cur; // <<<<----------------- [1]
if (newEntity.add && newEntity.add.trim().length === 0) {
delete newEntity.add; // <<<<-------------- [2]
}
return JSON.stringify(newEntity);
}).join();
这是一个很好的字符串。据我了解,我创建了内容的shallow copy,然后删除(delete)属性。我的问题是,为什么delete 没有应用于原始列表(data.edit.lstAnnotation.lstComments)?
我仍然在data.edit.lstAnnotation.lstComments 条目中使用key cur,例如data.edit.lstAnnotation.lstComments['abc'].cur ==> object....
我对目前的情况很满意。但是,如果我从复制的对象中删除并且原始对象没有更新,我会说这是一个深层副本。那么,我的错误在哪里?
【问题讨论】:
-
您的代码在任何地方都没有调用
Object.assign...这是一个错误吗?如果您希望通过删除属性更改副本也应该更改原始文件,那么您认为与根本不制作副本应该有什么不同的行为尚不清楚。你打算如何让const copy = {...original};在行为上与const copy = original;不同? -
我认为
{...original}与Object.assign{{},original}相同,尽管我不太确定。尤其是因为后者有时间惩罚。 -
Object spread syntax 不完全等同于
Object.assign,因为它是doesn't trigger setters,而Object.assign是。
标签: typescript javascript-objects deep-copy