Ich habe ein Array von typisierten Objekten und muss eine separate Kopie davon erstellen, um an einem Klon arbeiten zu können.

Ich muss die Kopie des Wertes listProducts an configuratorProduct übergeben:

  listProducts: Product[];
  configuratorProducts : Product[];

Das versuche ich:

  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);
    }

Das Problem ist, dass der Compiler Folgendes zurückgibt:

Die Eigenschaft 'idProduct' ist für nicht vorhanden Geben Sie 'string' ein

Wie kann ich das lösen?

Vielen Dank an die Unterstützung

2
DarioN1 18 Apr. 2018 im 15:22

4 Antworten

Beste Antwort

Ich benutze gerne diese Klonfunktion

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;

Sehen Sie hier eine Demo

https://stackblitz.com/edit/typescript-qmzgf7

Wenn es sich um ein Array handelt, wird ein Array jedes geklonten Elements zurückgegeben. Wenn es sich um ein Datum handelt, wird ein neues Datum erstellt. Wenn es sich um ein Objekt handelt, werden die Eigenschaften mit jeder geklonten Eigenschaft auf ein neues Objekt reduziert. Wenn keines davon ein Wertobjekt oder eine Funktion ist, geben Sie es einfach zurück.

1
Adrian Brand 25 Juni 2018 im 22:09

Sie können eine Kopie mit dem Spread-Operator erstellen

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

1
bugs 18 Apr. 2018 im 12:40

Property 'idProduct' does not exist on type 'string' Da p string ist, haben Sie einen einfachen Fehler gemacht

for(let p in this.configuratorProducts)
{
  ...
}

Sollte sein

for(let p of this.configuratorProducts)
    {
      ...
    }

for(let p in this.configuratorProducts) wird verwendet, um Schlüssel von Objekten zu iterieren, die Zeichenfolgen sind. of wird verwendet, um Werte zu iterieren, die hier Product sind

Und es gibt zwei Arten des Klonens: Deep Clone und Shallow Clone.

1
amit77309 18 Apr. 2018 im 13:12

Warum verwenden Sie kein allgemeines statisches Klon-Tool?

Beispielsweise:

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;
  }
}

(Ich fand dies in SO, konnte aber ehrlich gesagt die ursprüngliche Antwort nicht finden.)

Möglicherweise funktionieren auch andere Klonlösungen für Sie.

0
ForestG 18 Apr. 2018 im 12:26