Nodejs: so Klonen Sie ein Objekt
Wenn ich den clone eines Arrays verwende ich cloneArr = arr.slice()
Möchte ich wissen, wie Sie ein Objekt Klonen in nodejs.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich den clone eines Arrays verwende ich cloneArr = arr.slice()
Möchte ich wissen, wie Sie ein Objekt Klonen in nodejs.
Du musst angemeldet sein, um einen Kommentar abzugeben.
For utilities und Klassen, wo es keine Notwendigkeit von squeeze jeden Tropfen Leistung, ich habe oft betrügen und nur die JSON verwenden, führen Sie eine Tiefe Kopie:
Dies ist nicht die einzige Antwort oder die elegante Antwort, alle anderen Antworten sollten berücksichtigt werden, die für die Produktion von Engpässen. Jedoch, dies ist ein quick-and-dirty-Lösung, die sehr effektiv und nützlich in den meisten Situationen, wo ich Sie Klonen eine einfache hash-Eigenschaften.
ObjectId
s im Mongo) nicht richtig kopiert, das durch diesen Ansatz erhalten Sie in strings umgewandelt, anstatt. Ich vermute, Sie sind übergeordnetetoString
oder etwas ähnliches.newObj = obj.clone(args...);
Objekt.weisen Sie noch nicht erwähnt worden in einem der oben genannten Antworten.
Wenn Sie auf ES6 können Sie den spread-operator:
Referenz: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Gibt es einige Knoten Module gibt, wenn Sie nicht wollen, zu "roll your own". Das sieht gut aus: https://www.npmjs.com/package/clone
Sieht aus wie es verarbeitet alle Arten von Sachen, einschließlich der zirkulären Referenzen. Aus der github Seite:
Es ist schwer zu tun, eine generische, aber nützliche clone-Betrieb, denn was sollte geklont werden, die rekursiv und was sollte das gerade kopiert wird, hängt davon ab, wie das jeweilige Objekt wirken soll.
Etwas, das nützlich sein kann ist
In diesem code die Logik ist
null
oderundefined
nur wieder das gleiche (der Besondere Fall ist, erforderlich, weil es ein Fehler ist, zu versuchen, um zu sehen, wenn einclone
- Methode vorhanden ist)clone
Methode ? verwenden Sie dann, dassDiese Klon-Funktion ermöglichen sollte, die Umsetzung custom clone-Methoden leicht... zum Beispiel
Wenn in das Objekt, das Sie wissen, dass eine korrekte cloning-Vorgang für einen bestimmten array ist nur eine flache Kopie dann können Sie anrufen
values.slice()
stattclone(values)
.Zum Beispiel im obigen code bin ich ausdrücklich vorschreibt, dass ein Klonen von einem polygon-Objekt Klonen der Punkte, aber teilen die gleiche style-Objekt. Wenn ich clone das style-Objekt zu anstelle, dann kann ich nur weitergeben
clone(this.style)
..clone
- Methode selbst. Dies ist der beste Weg, um mit dem Klonen von Objekten.if (x.clone)
sollteif (typeof x.clone === 'function')
Es gibt keine native Methode zum Klonen von Objekten. Unterstrich implementiert
_.clone
, die einen flachen Klon.Es entweder in Scheiben oder erweitert es.
Hier
_.verlängern
Verlängern einfach iteriert durch alle Elemente, und erstellt ein neues Objekt mit den Elementen in es.
Können Sie roll-out Ihrer eigenen naiven Umsetzung, wenn Sie wollen
Gibt es gute Gründe, um zu vermeiden, tief Klonen, weil die Verschlüsse können nicht geklont werden.
Habe ich persönlich eine Frage stellen über
tiefes Klonen von Objekten vor
und ich den Schluss gekommen ist, dass Sie einfach nicht tun es.Meine Empfehlung ist, verwenden Sie
Unterstrich
und es ist_.clone
Methode für flache KloneFür eine flache Kopie, möchte ich reduzieren Muster (in der Regel in einem Modul oder so), etwa so:
Hier ein jsperf für ein paar der Optionen: http://jsperf.com/shallow-copying
Alte Frage, aber es gibt eine elegantere Antwort als das, was vorgeschlagen worden bisher; verwenden der built-in-utils._extend:
Beachten Sie die Verwendung der ersten parameter ein leeres Objekt {} - das zeigt verlängern, dass das kopierte Objekt(E) kopiert werden müssen, um ein neues Objekt. Wenn Sie ein vorhandenes Objekt als ersten parameter, dann wird die zweite (und alle nachfolgenden) Parameter tief-merge-kopiert den ersten parameter-variable.
Mithilfe der Beispiel-Variablen vor, können Sie dies auch tun:
Sehr praktisches Werkzeug, vor allem, wo werde ich verwendet, um erstrecken sich in AngularJS und jQuery.
Hoffe, dies hilft jemand anderes; Objekt-Referenz überschrieben sind ein Elend, und das löst jedes mal!
Können Sie lodash als gut. Es hat eine Klon und cloneDeep Methoden.
Je nachdem, was Sie tun möchten, mit Ihrem geklonten Objekt, das Sie nutzen können die prototypal inheritence-Mechanismus von javascript und erreichen eine etwas geklontes Objekt durch:
Nur daran erinnern, dass dies nicht ein "full clone" - für besser oder schlechter.
Eine gute Sache ist, dass Sie eigentlich noch nicht dupliziert das Objekt, damit der Speicherbedarf gering ist.
Einige knifflige Dinge zu erinnern, obwohl Sie über diese Methode ist, dass die iteration von Eigenschaften definiert, die in der Prototyp-Kette manchmal funktioniert etwas anders und die Tatsache, dass jede änderung auf das ursprüngliche Objekt auswirken wird das geklonte Objekt als gut, es sei denn, die Eigenschaft festgelegt wurde, auf sich selbst auch.
var a = {foo: "bar"}, b = Object.create(a); a.foo = "broken"; console.log(b.foo); // "broken";
Implementiert habe ich eine volle Tiefe Kopie. Ich glaube, es ist die beste Wahl für eine generische clone-Methode, aber es funktioniert nicht mit zyklischen Referenzen.
Beispiel:
Der code selbst:
Dieser code kopiert Objekte mit Ihren Prototypen, es auch copy-Funktionen (könnte nützlich sein für jemanden).
Mit dieser Kopie kann ich keinen Unterschied zwischen der ursprünglichen und der kopierten außer wenn das original verwendet Sperrungen auf seine Konstruktion, so dass ich denke es ist eine gute Umsetzung.
Ich hoffe, es hilft
array, kann man
arr=arr.slice(0);