Das Googeln nach "Javascript-Klonobjekt" bringt einige wirklich seltsame Ergebnisse, einige sind hoffnungslos veraltet und andere einfach zu komplex, ist es nicht so einfach wie nur:
let clone = {...original};
Ist daran etwas falsch?
javascript
ecmascript-6
javascript-objects
Dmitry Fadeev
quelle
quelle
original = { a: [1,2,3] }
gibt Ihnen einen Klon mitclone.a
buchstäblich Seinoriginal.a
. Modifikation durch entwederclone
oderoriginal
modifiziert dasselbe , also nein, das ist schlecht =)Antworten:
Dies ist gut für das flache Klonen . Die Objektverteilung ist ein Standardbestandteil von ECMAScript 2018 .
Für das Deep Cloning benötigen Sie eine andere Lösung .
const clone = {...original}
zu flachem Klonconst newobj = {...original, prop: newOne}
unveränderlich eine weitere Requisite zum Original hinzufügen und als neues Objekt speichern.quelle
JSON.parse(JSON.stringify(input))
JSON.parse(JSON.stringify(input))
nicht, denn wenn es dortfunctions
oderinfinity
als Werte vorhanden ist, wird es einfachnull
an ihrer Stelle zugewiesen . Es wird nur funktionieren, wenn die Werte einfach sindliterals
und nichtfunctions
.BEARBEITEN: Als diese Antwort veröffentlicht wurde, war die
{...obj}
Syntax in den meisten Browsern nicht verfügbar. Heutzutage sollten Sie damit einverstanden sein (es sei denn, Sie müssen IE 11 unterstützen).Verwenden Sie Object.assign.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Dies macht jedoch keinen tiefen Klon. Es gibt noch keine native Methode zum tiefen Klonen.
BEARBEITEN: Wie @Mike 'Pomax' Kamermans in den Kommentaren erwähnt hat, können Sie einfache Objekte (dh keine Prototypen, Funktionen oder Zirkelverweise) mit tief klonen
JSON.parse(JSON.stringify(input))
quelle
JSON.parse(JSON.stringify(input))
handelt es sich um einen richtigen tiefen Klon. In dem Moment, in dem Prototypen, Funktionen oder Zirkelverweise im Spiel sind, funktioniert diese Lösung jedoch nicht mehr.Wenn die von Ihnen verwendeten Methoden mit Objekten mit Datentypen wie Datum nicht gut funktionieren , versuchen Sie dies
Importieren
_
Tiefes Klonobjekt
quelle
import _ from 'lodash';
ist ausreichend. Aber +1 für die Antwort "Rad nicht neu erfinden".Wenn Sie json.parse (json.stringify (Objekt)) nicht verwenden möchten, können Sie rekursiv Schlüsselwertkopien erstellen:
Der beste Weg ist jedoch, eine Klasse zu erstellen, die einen Klon von sich selbst zurückgeben kann
quelle
Nach der Antwort von @marcel stellte ich fest, dass einige Funktionen des geklonten Objekts noch fehlten. z.B
Wo auf MyObject konnte ich Methode A klonen, aber Methode B wurde ausgeschlossen. Dies geschah, weil es fehlt
was bedeutete, dass es nicht in auftauchte
Stattdessen wechselte ich zu
Dies beinhaltet nicht aufzählbare Schlüssel.
Ich fand auch, dass der Prototyp ( Proto ) nicht geklont wurde. Dafür habe ich letztendlich verwendet
PS: Frustrierend, dass ich keine eingebaute Funktion dafür finden konnte.
quelle
Sie können es auch so machen,
quelle
Object.assign () erstellt jedoch keinen tiefen Klon
Um dies zu beheben, sollten wir die Klonschleife verwenden, die jeden Wert von Benutzer [Schlüssel] untersucht und, wenn es sich um ein Objekt handelt, auch dessen Struktur repliziert. Das nennt man ein "tiefes Klonen".
Es gibt einen Standardalgorithmus für das tiefe Klonen, der den obigen Fall und komplexere Fälle behandelt, den strukturierten Klonalgorithmus . Um das Rad nicht neu zu erfinden, können wir eine funktionierende Implementierung aus der JavaScript-Bibliothek lodash verwenden. Die Methode heißt _.cloneDeep (obj) .
quelle
Alle oben genannten Methoden behandeln nicht das tiefe Klonen von Objekten, bei denen es auf n Ebenen verschachtelt ist. Ich habe die Leistung nicht gegenüber anderen überprüft, aber sie ist kurz und einfach.
Das erste Beispiel unten zeigt
Object.assign
das Klonen von Objekten, mit denen Klone bis zur ersten Ebene geklont werden.Mit dem folgenden Ansatz klonen tiefe Objekte
quelle