Wenn ich ein Array klone, verwende ich cloneArr = arr.slice()
Ich möchte wissen, wie man ein Objekt in nodejs klont.
javascript
node.js
guilin 桂林
quelle
quelle
newObj = obj.clone(args...);
Object.assign wurde in keiner der obigen Antworten erwähnt.
Wenn Sie mit ES6 arbeiten, können Sie den Spread-Operator verwenden:
Referenz: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
quelle
let a = {x:1}; let b = Object.assign({}, a); a.x = 2; a.y = 1; console.log(a, b);
Es gibt einige Node-Module, wenn Sie nicht "Ihre eigenen rollen" möchten. Dieser sieht gut aus: https://www.npmjs.com/package/clone
Sieht so aus, als würde es alle möglichen Dinge behandeln, einschließlich Zirkelverweise. Von der Github- Seite:
quelle
Es ist schwierig, eine generische, aber nützliche Klonoperation durchzuführen, da es davon abhängt, wie das bestimmte Objekt funktionieren soll, was rekursiv geklont und was nur kopiert werden soll.
Etwas, das nützlich sein kann, ist
In diesem Code ist die Logik
null
oderundefined
einfach nur zurückgeben (der Sonderfall wird benötigt, weil es ein Fehler ist, zu versuchen, festzustellen, ob eineclone
Methode vorhanden ist)clone
Methode? dann benutze dasDiese Klonfunktion sollte es ermöglichen, benutzerdefinierte Klonmethoden einfach zu implementieren ... zum Beispiel
Wenn Sie im Objekt wissen, dass ein korrekter Klonvorgang für ein bestimmtes Array nur eine flache Kopie ist, können Sie
values.slice()
stattdessen aufrufenclone(values)
.Zum Beispiel fordere ich im obigen Code ausdrücklich, dass beim Klonen eines Polygonobjekts die Punkte geklont werden, aber dasselbe Stilobjekt verwendet wird. Wenn ich stattdessen auch das Stilobjekt klonen möchte, kann ich einfach übergeben
clone(this.style)
.quelle
.clone
Methode selbst implementieren müssen. Dies ist der beste Weg, um mit dem Klonen von Objekten umzugehen.if (x.clone)
sollte seinif (typeof x.clone === 'function')
Es gibt keine native Methode zum Klonen von Objekten. Unterstrichen implementiert,
_.clone
was ein flacher Klon ist.Es schneidet es entweder oder erweitert es.
Hier ist
_.extend
Extend durchläuft einfach alle Elemente und erstellt ein neues Objekt mit den darin enthaltenen Elementen.
Sie können Ihre eigene naive Implementierung einführen, wenn Sie möchten
Es gibt gute Gründe, tiefes Klonen zu vermeiden, da Verschlüsse nicht geklont werden können.
Ich habe persönlich eine Frage gestellt
deep cloning objects before
und bin zu dem Schluss gekommen, dass Sie es einfach nicht tun.Meine Empfehlung ist die Verwendung
underscore
und die_.clone
Methode für flache Klonequelle
Für eine flache Kopie verwende ich gerne das Verkleinerungsmuster (normalerweise in einem Modul oder ähnlichem) wie folgt:
Hier ist ein jsperf für einige der Optionen: http://jsperf.com/shallow-copying
quelle
Alte Frage, aber es gibt eine elegantere Antwort als bisher vorgeschlagen; Verwenden Sie die integrierten utils._extend:
Beachten Sie die Verwendung des ersten Parameters mit einem leeren Objekt {} - dies weist darauf hin, dass die kopierten Objekte in ein neues Objekt kopiert werden müssen. Wenn Sie ein vorhandenes Objekt als ersten Parameter verwenden, werden die zweiten (und alle nachfolgenden) Parameter über die erste Parametervariable tief zusammengeführt.
Mit den obigen Beispielvariablen können Sie auch Folgendes tun:
Sehr praktisches Dienstprogramm, insbesondere dort, wo ich es gewohnt bin, in AngularJS und jQuery zu erweitern.
Hoffe das hilft jemand anderem; Überschreiben von Objektreferenzen sind ein Elend, und dies löst es jedes Mal!
quelle
Sie können auch lodash verwenden . Es hat einen Klon und cloneDeep Methoden.
quelle
Je nachdem, was Sie mit Ihrem geklonten Objekt tun möchten, können Sie den prototypischen Vererbungsmechanismus von Javascript verwenden und ein etwas geklontes Objekt erzielen durch:
Denken Sie daran, dass dies kein vollständiger Klon ist - zum Guten oder Schlechten.
Eine gute Sache dabei ist, dass Sie das Objekt tatsächlich nicht dupliziert haben, sodass der Speicherbedarf gering ist.
Einige schwierige Dinge, die Sie bei dieser Methode beachten sollten, sind, dass die Iteration der in der Prototypenkette definierten Eigenschaften manchmal etwas anders funktioniert und dass Änderungen am ursprünglichen Objekt auch das geklonte Objekt betreffen, sofern diese Eigenschaft nicht auch für sich selbst festgelegt wurde .
quelle
var a = {foo: "bar"}, b = Object.create(a); a.foo = "broken"; console.log(b.foo); // "broken";
b.foo = "working"; console.log(a.foo); // still "broken";
Man muss sich natürlich bewusst sein, dass Änderungen am Originalobjekt im "Klon" wiedergegeben werden und dass Änderungen am "Klon" nicht im Originalobjekt wiedergegeben werden - aber ich würde es nicht als gefährlich bezeichnen - Es hängt alles davon ab, was Sie mit Ihrem Klon machen wollenIch habe eine vollständige, tiefe Kopie implementiert. Ich glaube, es ist die beste Wahl für eine generische Klonmethode, aber es werden keine zyklischen Referenzen verarbeitet.
Anwendungsbeispiel:
Der Code selbst:
Dieser Code kopiert Objekte mit ihren Prototypen und kopiert auch Funktionen (kann für jemanden nützlich sein).
Mit dieser Kopie kann ich keinen Unterschied zwischen dem Original und dem kopierten finden, außer wenn das Original Verschlüsse für seine Konstruktion verwendet hat, daher denke ich, dass es eine gute Implementierung ist.
Ich hoffe, es hilft
quelle
für Array kann man verwenden
arr = arr.slice (0);
quelle
Objekte und Arrays in JavaScript verwenden den Aufruf als Referenz. Wenn Sie den kopierten Wert aktualisieren, wird dies möglicherweise auf das ursprüngliche Objekt angewendet. Um dies zu verhindern, können Sie das Objekt mit dem Befehl run der Methode cloneDeep der lodash-Bibliothek tief klonen und verhindern, dass die Referenz übergeben wird
quelle