Angular2 - 类型化对象的克隆数组

时间:2018-04-18 12:22:16

标签: angular typescript

我有一个类型化对象数组,我需要创建一个单独的副本,以便能够处理克隆。

我必须将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'

我该如何解决?

感谢支持

4 个答案:

答案 0 :(得分:1)

您可以使用点差运算符

制作副本

this.configuratorProducts = [...this.listProducts]

答案 1 :(得分:1)

Property 'idProduct' does not exist on type 'string'因为pstring,你犯了一个简单的错误

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也适合你。