Jaki jest najlepszy sposób klonowania obiektu w node.js
np. chcę uniknąć sytuacji, w której:
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
Obiekt może zawierać złożone typy jako atrybuty, więc proste dla (var x w obj1) nie rozwiązałoby się. Czy muszę sam napisać rekurencyjny klon, czy jest coś wbudowanego, czego nie widzę?
javascript
node.js
slifty
źródło
źródło
npm install underscore
2.var _ = require('underscore')
3_.clone(objToClone)
.;Odpowiedzi:
Możliwość 1
Głęboka kopia o niskiej falbance:
Możliwość 2 (przestarzałe)
Uwaga: To rozwiązanie jest teraz oznaczone jako przestarzałe w dokumentacji Node.js :
Oryginalna odpowiedź: :
Aby uzyskać płytką kopię, użyj wbudowanej
util._extend()
funkcji Node .Kod źródłowy funkcji Node znajduje
_extend
się tutaj: https://github.com/joyent/node/blob/master/lib/util.jsźródło
_*
powinna oznaczać, że jest to metoda prywatna i na której nie można polegać?util._extend()
Object.assign().
Dziwię się,
Object.assign
że nie wspomniano.Jeśli jest dostępny (np. Babel), możesz użyć operatora rozkładania obiektów :
źródło
Spowoduje to zdefiniowanie metody rozszerzania, której można użyć. Kod pochodzi z tego artykułu.
źródło
źródło
Object.keys()
do iteracji po obiekcieMożesz użyć funkcji rozszerzenia z JQuery:
Istnieje również wtyczka Node.js:
https://github.com/shimondoodkin/nodejs-clone-extend
Aby to zrobić bez JQuery lub wtyczki, przeczytaj to tutaj:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
źródło
Sprawdź underscore.js . Ma zarówno klon, jak i rozszerzenie oraz wiele innych bardzo przydatnych funkcji.
Może to być przydatne: Korzystanie z modułu podkreślenia w Node.js
źródło
Istnieje kilka modułów Node, jeśli nie chcesz „tworzyć własnych”. Ten wygląda dobrze: https://www.npmjs.com/package/clone
Wygląda na to, że obsługuje wszystkie rodzaje rzeczy, w tym odwołania cykliczne. Ze strony github :
źródło
Ten kod działa również, ponieważ metoda Object.create () tworzy nowy obiekt z określonym obiektem prototypowym i właściwościami.
źródło
Najprostszym i najszybszym sposobem klonowania obiektu w NodeJS jest użycie metody Object.keys (obj)
Metoda Object.keys wymaga JavaScript 1.8.5; nodeJS v0.4.11 obsługuje tę metodę
ale oczywiście w przypadku obiektów zagnieżdżonych należy zaimplementować funkcję rekurencyjną
Innym rozwiązaniem jest użycie natywnego JSON (zaimplementowanego w JavaScript 1.7), ale jest on znacznie wolniejszy (~ 10 razy wolniejszy) niż poprzedni
źródło
Istnieje również projekt na Github, który ma być bardziej bezpośrednim portem
jQuery.extend()
:https://github.com/dreamerslab/node.extend
Przykład zmodyfikowany z dokumentów jQuery :
źródło
Jest inna biblioteka lodash , ma klona i cloneDeep , także wiele innych przydatnych funkcji.
źródło
Wszyscy cierpicie, ale rozwiązanie jest proste.
var obj2 = {...obj1};
// Bumźródło
Szukając prawdziwej opcji klonowania, natknąłem się na link Ridcully do tutaj:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
Zmodyfikowałem rozwiązanie na tej stronie, aby funkcja dołączona do
Object
prototypu nie była wymienna. Oto mój wynik:Mam nadzieję, że pomoże to również komuś innemu. Należy pamiętać, że istnieją pewne zastrzeżenia ... szczególnie w przypadku właściwości o nazwie „klon”. To działa dobrze dla mnie. Nie biorę żadnego uznania za napisanie tego. Ponownie zmieniłem tylko sposób, w jaki był definiowany.
źródło
Możesz także użyć SugarJS w NodeJS.
http://sugarjs.com/
Mają bardzo czystą funkcję klonowania: http://sugarjs.com/api/Object/clone
źródło
Jeśli używasz skryptu do kawy, jest to tak proste, jak:
Chociaż to nie jest głęboki klon.
źródło
Żadna z odpowiedzi mnie nie zadowoliła, kilka nie działa lub są tylko płytkimi klonami, odpowiedzi @ clint-harris i użycie JSON.parse / stringify są dobre, ale dość powolne. Znalazłem moduł, który szybko dokonuje głębokiego klonowania: https://github.com/AlexeyKupershtokh/node-v8-clone
źródło
Nie ma wbudowanego sposobu wykonania prawdziwego klonowania (głębokiej kopii) obiektu w node.js. Istnieje kilka trudnych przypadków, więc zdecydowanie powinieneś użyć do tego biblioteki. Taką funkcję napisałem dla mojej biblioteki simpleoo . Możesz użyć tej
deepCopy
funkcji bez użycia czegokolwiek z biblioteki (która jest dość mała), jeśli jej nie potrzebujesz. Ta funkcja obsługuje klonowanie wielu typów danych, w tym tablic, dat i wyrażeń regularnych, obsługuje odwołania rekurencyjne, a także działa z obiektami, których funkcje konstruktora mają wymagane parametry.Oto kod:
źródło
Najszybszy kloner, otwiera natywną metodę klonowania z node.js
źródło
Innym rozwiązaniem jest enkapsulacja bezpośrednio w nowej zmiennej przy użyciu:
obj1= {...obj2}
źródło
Możesz także użyć tej biblioteki klonowania do głębokiego klonowania obiektów.
źródło
Możesz prototypować obiekt, a następnie wywoływać instancję obiektu za każdym razem, gdy chcesz użyć i zmienić obiekt:
Możesz także przekazać argumenty do konstruktora obiektów
Mam nadzieję, że to jest pomocne.
źródło