Was ist der beste Weg, um ein Objekt in node.js zu klonen?
zB möchte ich die Situation vermeiden, in der:
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
Das Objekt kann durchaus komplexe Typen als Attribute enthalten, sodass ein einfaches for (var x in obj1) nicht gelöst werden kann. Muss ich selbst einen rekursiven Klon schreiben oder ist etwas eingebaut, das ich nicht sehe?
javascript
node.js
schlampig
quelle
quelle
npm install underscore
2.var _ = require('underscore')
3 ._.clone(objToClone)
;Antworten:
Möglichkeit 1
Low-Frills tiefe Kopie:
Möglichkeit 2 (veraltet)
Achtung: Diese Lösung ist jetzt in der Dokumentation von Node.js als veraltet markiert :
Ursprüngliche Antwort ::
Verwenden Sie für eine flache Kopie die integrierte
util._extend()
Funktion von Node .Der Quellcode der Node-
_extend
Funktion finden Sie hier: https://github.com/joyent/node/blob/master/lib/util.jsquelle
_*
bedeuten, dass er eine private Methode ist und auf die man sich nicht verlassen sollte?util._extend()
Methode sollte niemals außerhalb der internen Node.js-Module verwendet werden. Die Community hat es trotzdem gefunden und benutzt. Es ist veraltet und sollte nicht in neuem Code verwendet werden. JavaScript kommt mit sehr ähnlichen integrierten Funktionen durchObject.assign().
Ich bin überrascht, dass
Object.assign
es nicht erwähnt wurde.Falls verfügbar (z. B. Babel), können Sie den Objektverteilungsoperator verwenden :
quelle
Dadurch wird eine Erweiterungsmethode definiert, die Sie verwenden können. Code stammt aus diesem Artikel.
quelle
quelle
Object.keys()
, um durch das Objekt zu iterierenSie können die Extend-Funktion von JQuery verwenden:
Es gibt auch ein Node.js Plugin:
https://github.com/shimondoodkin/nodejs-clone-extend
Um dies ohne JQuery oder Plugin zu tun, lesen Sie dies hier:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
quelle
Schauen Sie sich underscore.js an . Es hat sowohl Klon als auch Erweiterung und viele andere sehr nützliche Funktionen.
Dies kann nützlich sein: Verwenden des Unterstrichmoduls mit Node.js.
quelle
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
Dieser Code funktioniert auch, weil die Object.create () -Methode ein neues Objekt mit dem angegebenen Prototypobjekt und den angegebenen Eigenschaften erstellt.
quelle
Der einfache und schnellste Weg, ein Objekt in NodeJS zu klonen, ist die Verwendung der Object.keys (obj) -Methode
Die Methode Object.keys erfordert JavaScript 1.8.5; nodeJS v0.4.11 unterstützt diese Methode
Aber natürlich müssen für verschachtelte Objekte rekursive Funktionen implementiert werden
Eine andere Lösung ist die Verwendung von nativem JSON (implementiert in JavaScript 1.7), aber es ist viel langsamer (~ 10-mal langsamer) als das vorherige
quelle
Es gibt auch ein Projekt auf Github, das darauf abzielt, ein direkterer Hafen der
jQuery.extend()
:https://github.com/dreamerslab/node.extend
Ein Beispiel, das aus den jQuery-Dokumenten geändert wurde :
quelle
Es gibt eine andere Bibliothek lodash , es hat Clone und CloneDeep , auch viele andere nützliche Funktionen.
quelle
Auf der Suche nach einer echten Klonoption bin ich über Ridcullys Link hierher gestolpert:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
Ich habe die Lösung auf dieser Seite so geändert, dass die an den
Object
Prototyp angehängte Funktion nicht aufzählbar ist. Hier ist mein Ergebnis:Hoffentlich hilft das auch jemand anderem. Beachten Sie, dass es einige Einschränkungen gibt ... insbesondere bei Eigenschaften mit dem Namen "Klon". Das funktioniert gut für mich. Ich nehme keine Anerkennung dafür, dass ich es geschrieben habe. Wieder habe ich nur geändert, wie es definiert wurde.
quelle
Sie leiden, aber die Lösung ist einfach.
var obj2 = {...obj1};
// Boomquelle
Sie können SugarJS auch in NodeJS verwenden.
http://sugarjs.com/
Sie haben eine sehr saubere Klonfunktion: http://sugarjs.com/api/Object/clone
quelle
Wenn Sie ein Kaffeeskript verwenden, ist dies so einfach wie:
Obwohl dies kein tiefer Klon ist.
quelle
Keine der Antworten hat mich zufrieden gestellt, einige funktionieren nicht oder sind nur flache Klone. Die Antworten von @ clint-harris und die Verwendung von JSON.parse / stringify sind gut, aber ziemlich langsam. Ich habe ein Modul gefunden, das Deep Cloning schnell ausführt : https://github.com/AlexeyKupershtokh/node-v8-clone
quelle
Es gibt keine integrierte Möglichkeit, einen echten Klon (Deep Copy) eines Objekts in node.js zu erstellen. Es gibt einige knifflige Randfälle, daher sollten Sie auf jeden Fall eine Bibliothek dafür verwenden. Ich habe eine solche Funktion für meine simpleoo- Bibliothek geschrieben. Sie können die
deepCopy
Funktion verwenden, ohne etwas anderes aus der Bibliothek zu verwenden (was ziemlich klein ist), wenn Sie es nicht benötigen. Diese Funktion unterstützt das Klonen mehrerer Datentypen, einschließlich Arrays, Datumsangaben und regulärer Ausdrücke, unterstützt rekursive Referenzen und funktioniert auch mit Objekten, für deren Konstruktorfunktionen Parameter erforderlich sind.Hier ist der Code:
quelle
Der schnellste Kloner öffnet die native Klonmethode aus node.js.
quelle
Eine andere Lösung besteht darin, direkt in die neue Variable zu kapseln, indem Sie Folgendes verwenden:
obj1= {...obj2}
quelle
Sie können diese Klonbibliothek auch zum tiefen Klonen von Objekten verwenden.
quelle
Sie können Objekte prototypisieren und dann jedes Mal eine Objektinstanz aufrufen, wenn Sie ein Objekt verwenden und ändern möchten:
Sie können Argumente auch an den Objektkonstruktor übergeben
Hoffe das ist hilfreich.
quelle