【发布时间】:2017-12-02 04:41:46
【问题描述】:
我有两个对象的数组:
genericItems: Item[] = [];
backupData: Item[] = [];
我正在用genericItemsdata 填充我的HTML 表。该表是可修改的。有一个重置按钮可以撤消使用backUpData 所做的所有更改。该数组由服务填充:
getGenericItems(selected: Item) {
this.itemService.getGenericItems(selected).subscribe(
result => {
this.genericItems = result;
});
this.backupData = this.genericItems.slice();
}
我的想法是,用户更改将反映在第一个数组中,第二个数组可以用作重置操作的备份。我在这里面临的问题是当用户修改表时(genericItems[]) 第二个数组backupData 也被修改了。
这是如何发生的以及如何预防?
【问题讨论】:
-
看起来你做了一个数组的浅拷贝。听起来您正在修改他们持有的对象并查看更改。您需要制作深拷贝或想出一种不同的方式来表示您的数据。
-
它们指向同一个引用。如果你使用 lodash 或类似的库返回一个新数组,你就不会有这个问题。
-
slice()我猜会从另一个数组创建新对象... -
第二个数组正在被修改,因为您只是在引用原始数组,而不是创建一个新数组。如果您使用类型脚本和 ES6,您可以创建这样的副本 this.backupData = [...this.genericItems] 这将创建数组的副本。希望有帮助!
-
@MolikMiah 我是说
slice接受一个数组并将每个引用复制到一个新数组中。所以老数组和新数组其实是不一样的,但是里面的对象是完全一样的。所以应该和[...array]一样
标签: arrays angular typescript