¿Cuál es la mejor manera de clonar un objeto en node.js?
Por ejemplo, quiero evitar la situación en la que:
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
El objeto puede contener tipos complejos como atributos, por lo que un simple para (var x en obj1) no resolvería. ¿Necesito escribir un clon recursivo yo mismo o hay algo incorporado que no estoy viendo?
javascript
node.js
astuto
fuente
fuente
npm install underscore
2.var _ = require('underscore')
3_.clone(objToClone)
.;Respuestas:
Posibilidad 1
Copia profunda de bajo costo:
Posibilidad 2 (en desuso)
Atención: esta solución ahora está marcada como obsoleta en la documentación de Node.js :
Respuesta original :
Para una copia superficial, use la función incorporada de Node
util._extend()
.El código fuente de la
_extend
función de Node está aquí: https://github.com/joyent/node/blob/master/lib/util.jsfuente
_*
supone que un nombre significa que es un método privado y que no se debe confiar en él?util._extend()
método nunca fue diseñado para usarse fuera de los módulos internos de Node.js. La comunidad lo encontró y lo usó de todos modos. Está en desuso y no debe usarse en un código nuevo. JavaScript viene con una funcionalidad incorporada muy similar a través deObject.assign().
Me sorprende que
Object.assign
no se haya mencionado.Si está disponible (por ejemplo, Babel), puede usar el operador de propagación de objetos :
fuente
Esto definirá un método extendido que puede usar. El código proviene de este artículo.
fuente
fuente
Object.keys()
para iterar a través del objetoPuede usar la función extender de JQuery:
También hay un complemento Node.js:
https://github.com/shimondoodkin/nodejs-clone-extend
Para hacerlo sin JQuery o Plugin, lea esto aquí:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
fuente
Echa un vistazo a underscore.js . Tiene tanto clonar como extender y muchas otras funciones muy útiles.
Esto puede ser útil: Usar el módulo subrayado con Node.js
fuente
Hay algunos módulos de Nodo por ahí si no quieres "rodar el tuyo". Este se ve bien: https://www.npmjs.com/package/clone
Parece que maneja todo tipo de cosas, incluidas las referencias circulares. Desde la página de github :
fuente
Este código también funciona porque el método Object.create () crea un nuevo objeto con el objeto prototipo y las propiedades especificadas.
fuente
La manera más simple y rápida de clonar un objeto en NodeJS es usar el método Object.keys (obj)
El método Object.keys requiere JavaScript 1.8.5; nodeJS v0.4.11 admite este método
pero, por supuesto, para los objetos anidados es necesario implementar funciones recursivas
Otra solución es usar JSON nativo (implementado en JavaScript 1.7), pero es mucho más lento (~ 10 veces más lento) que el anterior
fuente
También hay un proyecto en Github que pretende ser un puerto más directo de
jQuery.extend()
:https://github.com/dreamerslab/node.extend
Un ejemplo, modificado de los documentos de jQuery :
fuente
Hay otra biblioteca lodash , tiene clone y cloneDeep , también muchas otras funciones útiles.
fuente
Todos sufren pero la solución es simple.
var obj2 = {...obj1};
// Boomfuente
Buscando una verdadera opción de clonación, me topé con el enlace de ridcully aquí:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
Modifiqué la solución en esa página para que la función asociada al
Object
prototipo no sea enumerable. Aquí está mi resultado:Esperemos que esto ayude a alguien más también. Tenga en cuenta que hay algunas advertencias ... particularmente con las propiedades llamadas "clon". Esto funciona bien para mi. No tomo ningún crédito por escribirlo. Nuevamente, solo cambié la forma en que se estaba definiendo.
fuente
También puede usar SugarJS en NodeJS.
http://sugarjs.com/
Tienen una función de clonación muy limpia: http://sugarjs.com/api/Object/clone
fuente
Si está utilizando coffee-script, es tan fácil como:
Aunque este no es un clon profundo.
fuente
Ninguna de las respuestas me satisfizo, varias no funcionan o son clones poco profundos, las respuestas de @ clint-harris y el uso de JSON.parse / stringify son buenas pero bastante lentas. Encontré un módulo que hace una clonación profunda rápidamente: https://github.com/AlexeyKupershtokh/node-v8-clone
fuente
No hay una forma integrada de hacer un clon real (copia profunda) de un objeto en node.js. Hay algunos casos extremos complicados, por lo que definitivamente debe usar una biblioteca para esto. Escribí una función para mi biblioteca simpleoo . Puedes usar el
deepCopy
función sin usar nada más de la biblioteca (que es bastante pequeña) si no la necesita. Esta función admite la clonación de múltiples tipos de datos, incluidas matrices, fechas y expresiones regulares, admite referencias recursivas y también funciona con objetos cuyas funciones de constructor tienen los parámetros necesarios.Aquí está el código:
fuente
Clonador más rápido, abre el método de clonación nativo desde node.js
fuente
Otra solución es encapsular directamente en la nueva variable usando:
obj1= {...obj2}
fuente
También puede usar esta biblioteca de clonación para clonar objetos en profundidad.
fuente
Puede crear un prototipo de objeto y luego llamar a la instancia de objeto cada vez que quiera usar y cambiar de objeto:
También puede pasar argumentos al constructor de objetos
Espero que esto sea útil.
fuente