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
4 Antworten
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.
Sie können eine Kopie mit dem Spread-Operator erstellen
this.configuratorProducts = [...this.listProducts]
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.
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.
Neue Fragen
angular
Fragen zu Angular (nicht zu verwechseln mit AngularJS), dem Webframework von Google. Verwenden Sie dieses Tag für Winkelfragen, die nicht für eine einzelne Version spezifisch sind. Verwenden Sie für das ältere AngularJS (1.x) -Webframework das AngularJS-Tag.