我有一个类型化对象数组,我需要创建一个单独的副本,以便能够处理克隆。
我必须将listProducts值的副本传递给configuratorProduct:
listProducts: Product[];
configuratorProducts : Product[];
这就是我正在尝试的:
this.configuratorProducts = this.listProducts.map(x => Object.assign({}, x));
for(let p in this.configuratorProducts)
{
var ck = this.accessories.filter(x=> x.idProductParent == p.idProduct);
}
问题是编译器返回:
Property' idProduct'不存在 键入' string'
我该如何解决?
感谢支持
答案 0 :(得分:1)
您可以使用点差运算符
制作副本 this.configuratorProducts = [...this.listProducts]
答案 1 :(得分:1)
Property 'idProduct' does not exist on type 'string'
因为p
是string
,你犯了一个简单的错误
for(let p in this.configuratorProducts)
{
...
}
应该是
for(let p of this.configuratorProducts)
{
...
}
for(let p in this.configuratorProducts)
用于迭代对象的键,它们是字符串。 of
用于迭代值,此处为Product
有两种类型的克隆:深克隆和浅克隆,在使用之前进行了很好的研究。
答案 2 :(得分:1)
我喜欢使用此克隆功能
const clone = obj =>
Array.isArray(obj)
? obj.map(item => clone(item))
: obj instanceof Date
? new Date(obj.getTime())
: (typeof obj === 'object') && obj
? Object.getOwnPropertyNames(obj).reduce((o, prop) => ({ ...o, [prop]: clone(obj[prop]) }), {})
: obj;
在此处查看演示
https://stackblitz.com/edit/typescript-qmzgf7
如果是数组,则返回克隆的每个项目的数组;如果是日期,则创建新的日期;如果是对象,则将属性简化为具有每个克隆的属性的新对象。如果这些都不是值对象或函数,则只需返回即可。
答案 3 :(得分:0)
为什么不使用常规静态克隆工具?
例如:
import {Injectable} from "@angular/core";
@Injectable()
export class ObjectCloneUtility{
public static clone(obj: Object): Object {
if (null == obj || "object" != typeof obj) return obj;
let copy = obj.constructor();
for (let attr in obj) {
if (obj.hasOwnProperty(attr)) {
copy[attr] = obj[attr];
}
}
return copy;
}
}
(我在SO中发现了这一点,但老实说无法找到原始答案。)
或者,也许其他clone solutions也适合你。