Si clono una matriz, uso cloneArr = arr.slice()
Quiero saber cómo clonar un objeto en nodejs.
javascript
node.js
guilin 桂林
fuente
fuente
newObj = obj.clone(args...);
Object.assign no se ha mencionado en ninguna de las respuestas anteriores.
Si está en ES6, puede usar el operador de propagación:
Referencia: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
fuente
let a = {x:1}; let b = Object.assign({}, a); a.x = 2; a.y = 1; console.log(a, b);
Hay algunos módulos de Node por ahí si no quiere "lanzar los suyos". 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
Es difícil hacer una operación de clonación genérica pero útil porque lo que se debe clonar de forma recursiva y lo que se debe copiar depende de cómo se supone que funcione el objeto específico.
Algo que puede resultar útil es
En este código la lógica es
null
oundefined
simplemente devolver el mismo (el caso especial es necesario porque es un error intentar ver si unclone
método está presente)clone
método? entonces usa esoEsta función de clonación debería permitir implementar métodos de clonación personalizados fácilmente ... por ejemplo
Cuando en el objeto sepa que una operación de clonación correcta para una matriz específica es solo una copia superficial, puede llamar en
values.slice()
lugar declone(values)
.Por ejemplo, en el código anterior, exijo explícitamente que una clonación de un objeto poligonal clone los puntos, pero compartirá el mismo objeto de estilo. Si también quiero clonar el objeto de estilo, simplemente puedo pasar
clone(this.style)
.fuente
.clone
método por sí mismos. Esta es la mejor forma de lidiar con la clonación de objetos.if (x.clone)
debería serif (typeof x.clone === 'function')
No existe un método nativo para clonar objetos. Subrayar los implementos
_.clone
que es un clon superficial.O lo corta en rodajas o lo extiende.
Aquí está
_.extend
Extend simplemente recorre todos los elementos y crea un nuevo objeto con los elementos que contiene.
Puede implementar su propia implementación ingenua si lo desea
Hay buenas razones para evitar la clonación profunda porque los cierres no se pueden clonar.
Personalmente hice una pregunta
deep cloning objects before
y la conclusión a la que llegué es que simplemente no lo haces.Mi recomendación es el uso
underscore
y su_.clone
método para clones poco profundos.fuente
Para una copia superficial, me gusta usar el patrón de reducción (generalmente en un módulo o similar), así:
Aquí hay un jsperf para un par de opciones: http://jsperf.com/shallow-copying
fuente
Antigua pregunta, pero hay una respuesta más elegante que la sugerida hasta ahora; use el utils._extend incorporado:
Tenga en cuenta el uso del primer parámetro con un objeto vacío {} - esto le dice a extender que los objetos copiados deben copiarse en un nuevo objeto. Si utiliza un objeto existente como primer parámetro, el segundo (y todos los siguientes) parámetros se copiarán en profundidad sobre la primera variable de parámetro.
Usando las variables de ejemplo anteriores, también puede hacer esto:
Utilidad muy útil, especialmente donde estoy acostumbrado a extenderme en AngularJS y jQuery.
Espero que esto ayude a alguien más; las sobreescrituras de referencias de objetos son una miseria, ¡y esto lo resuelve siempre!
fuente
También puedes usar lodash . Tiene métodos clone y cloneDeep .
fuente
Dependiendo de lo que quiera hacer con su objeto clonado, puede utilizar el mecanismo de herencia prototípico de javascript y lograr un objeto algo clonado a través de:
Solo recuerda que esto no es un clon completo, para bien o para mal.
Lo bueno de eso es que en realidad no ha duplicado el objeto, por lo que la huella de memoria será baja.
Sin embargo, algunas cosas difíciles de recordar sobre este método es que la iteración de las propiedades definidas en la cadena del prototipo a veces funciona de manera un poco diferente y el hecho de que cualquier cambio en el objeto original afectará al objeto clonado también a menos que esa propiedad también se haya establecido en sí mismo. .
fuente
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";
uno, por supuesto, debe tener en cuenta que los cambios en el objeto original se reflejarán en el "clon" y que los cambios en el "clon" no se reflejarán en el objeto original, pero yo no lo llamaría peligroso - todo depende de lo que quieras hacer con tu clonImplementé una copia profunda completa. Creo que es la mejor opción para un método de clonación genérico, pero no maneja referencias cíclicas.
Ejemplo de uso:
El código en sí:
Este código copia objetos con sus prototipos, también copia funciones (puede ser útil para alguien).
Con esta copia no puedo encontrar ninguna diferencia entre el original y el copiado, excepto si el original usó cierres en su construcción, así que creo que es una buena implementación.
Espero que ayude
fuente
para matriz, se puede usar
arr = arr.slice (0);
fuente
Los objetos y las matrices en JavaScript usan llamadas por referencia, si actualiza el valor copiado, podría reflejarse en el objeto original. Para evitar esto, puede clonar en profundidad el objeto, para evitar que se pase la referencia, utilizando el comando de ejecución del método cloneDeep de la biblioteca lodash
fuente