3750 Stimmen

Wie kann ich ein JavaScript-Objekt korrekt klonen?

Ich habe ein Objekt x . Ich würde es gerne als Objekt kopieren y , so dass Änderungen an y nicht verändern x . Ich habe festgestellt, dass das Kopieren von Objekten, die von integrierten JavaScript-Objekten abgeleitet sind, zu zusätzlichen, unerwünschten Eigenschaften führt. Das ist kein Problem, da ich eines meiner eigenen, wörtlich konstruierten Objekte kopiere.

Wie kann ich ein JavaScript-Objekt korrekt klonen?

35 Stimmen

0 Stimmen

Unterstützen Sie auf jeden Fall @Niyaz! Shortlink: tinyurl.com/JSCopyObject

290 Stimmen

Für JSON verwende ich mObj=JSON.parse(JSON.stringify(jsonObject));

23voto

João Oliveira Punkte 477

In ES-6 können Sie einfach Object.assign(...) verwenden. Beispiel:

let obj = {person: 'Thor Odinson'};
let clone = Object.assign({}, obj);

Eine gute Referenz ist hier zu finden: https://googlechrome.github.io/samples/object-assign-es6/

12 Stimmen

Das Objekt wird nicht tief geklont.

0 Stimmen

Das ist eine Zuweisung, keine Kopie. clone.Title = "just a clone" bedeutet, dass obj.Title = "just a clone".

0 Stimmen

@HoldOffHunger Sie irren sich. Überprüfen Sie es in der JS-Konsole Ihres Browsers ( let obj = {person: 'Thor Odinson'}; let clone = Object.assign({}, obj); clone.title = "Whazzup"; )

21voto

Mohammed Akdim Punkte 1807

Interessiert am Klonen einfacher Objekte:

JSON.parse(JSON.stringify(json_original));

Quelle: Wie kopiert man ein JavaScript-Objekt in eine neue Variable NICHT per Referenz?

0 Stimmen

Sehr schön - einfach.

0 Stimmen

@MattH: diese Antwort wurde bereits gegeben im Jahr 2012 . haben Sie es gesehen? Mohammed, hast du nachgesehen, ob es bereits Antworten gibt, bevor du eine von ihnen dupliziert hast?

0 Stimmen

Nun, das ist eine Möglichkeit. Daran habe ich nie gedacht.

19voto

Jeremy Punkte 1

Strukturiertes Klonen

2022 Aktualisierung: Die structuredClone() Funktion ist bereits in Node 17, Deno 1.14 und den meisten gängigen Browsern verfügbar (siehe Kann ich die ).

Sie kann verwenden denselben strukturierten Klon-Mechanismus, den der HTML-Standard für die Übermittlung von Daten zwischen Realms vorsieht.

const clone = structuredClone(original);

Ver die andere Antwort für weitere Einzelheiten.

2 Stimmen

+1 für eine Idee, in welcher Form es eventuell eingebaut werden könnte - auch wenn es im Moment noch unbrauchbar ist.

18voto

flori Punkte 11900
let clone = Object.assign( Object.create( Object.getPrototypeOf(obj)), obj)

ES6-Lösung, wenn Sie ein (oberflächliches) Klonen einer Klasseninstanz und nicht nur ein Eigenschaftsobjekt.

0 Stimmen

Was ist der Unterschied zu let cloned = Object.assign({}, obj) ?

0 Stimmen

@ceztko Wenn obj ist eine Klasseninstanz, Object.assign() klont z.B. keine Klassenmethoden (weil sie nicht aufzählbar sind).

17voto

Rob Evans Punkte 6464

Sie können ein Objekt klonen und alle Verweise auf das vorherige Objekt mit einer einzigen Codezeile entfernen. Tun Sie es einfach:

var obj1 = { text: 'moo1' };
var obj2 = Object.create(obj1); // Creates a new clone without references

obj2.text = 'moo2'; // Only updates obj2's text property

console.log(obj1, obj2); // Outputs: obj1: {text:'moo1'}, obj2: {text:'moo2'}

Bei Browsern/Engines, die Object.create derzeit nicht unterstützen, können Sie dieses Polyfill verwenden:

// Polyfill Object.create if it does not exist
if (!Object.create) {
    Object.create = function (o) {
        var F = function () {};
        F.prototype = o;
        return new F();
    };
}

1 Stimmen

+1 Object.create(...) scheint definitiv der richtige Weg zu sein.

0 Stimmen

Perfekte Antwort. Vielleicht könnten Sie eine Erklärung hinzufügen für Object.hasOwnProperty ? Auf diese Weise wissen die Leute, wie sie die Suche nach dem Prototyp-Link verhindern können.

0 Stimmen

Funktioniert gut, aber in welchen Browsern funktioniert die Polyfill-Funktion?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X