Estoy tratando de crear un método de mapa de copia profunda para mi proyecto Redux que funcionará con objetos en lugar de matrices. Leí que en Redux cada estado no debería cambiar nada en los estados anteriores.
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
output[key] = callback.call(this, {...object[key]});
return output;
}, {});
}
Funciona:
return mapCopy(state, e => {
if (e.id === action.id) {
e.title = 'new item';
}
return e;
})
Sin embargo, no copia en profundidad los elementos internos, por lo que necesito modificarlo para:
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
let newObject = {...object[key]};
newObject.style = {...newObject.style};
newObject.data = {...newObject.data};
output[key] = callback.call(this, newObject);
return output;
}, {});
}
Esto es menos elegante ya que requiere saber qué objetos se pasan. ¿Hay alguna forma en ES6 de usar la sintaxis de propagación para copiar en profundidad un objeto?
combineReducers
para componer los dos (o más) juntos. Si utiliza técnicas idiomáticas de reducción, su problema de clonación profunda de objetos desaparece.Respuestas:
Esta funcionalidad no está integrada en ES6. Creo que tienes un par de opciones dependiendo de lo que quieras hacer.
Si realmente desea realizar una copia profunda:
cloneDeep
método.Solución alternativa a su problema específico (sin texto completo)
Sin embargo, creo que si estás dispuesto a cambiar un par de cosas, puedes ahorrarte algo de trabajo. Supongo que controlas todos los sitios de llamadas a tu función.
Especifique que todas las devoluciones de llamada pasadas a
mapCopy
deben devolver nuevos objetos en lugar de mutar el objeto existente. Por ejemplo:Esto hace uso de
Object.assign
para crear un nuevo objeto, establece las propiedades dee
ese nuevo objeto y luego establece un nuevo título en ese nuevo objeto. Esto significa que nunca mutará objetos existentes y solo creará nuevos cuando sea necesario.mapCopy
puede ser realmente simple ahora:Esencialmente,
mapCopy
confía en que quienes llaman hagan lo correcto. Es por eso que dije que esto asume que usted controla todos los sitios de llamadas.fuente
En su lugar, use esto para una copia profunda
fuente
De MDN
Personalmente, sugiero usar la función cloneDeep de Lodash para la clonación de objetos / matrices de varios niveles.
Aquí hay un ejemplo práctico:
fuente
Run code snippet
y debería ejecutarse correctamente.A menudo uso esto:
fuente
Usar
JSON.stringify
yJSON.parse
es la mejor manera. Porque al usar el operador de propagación no obtendremos la respuesta eficiente cuando el objeto json contiene otro objeto dentro de él. necesitamos especificar eso manualmente.fuente
fuente
fuente
fuente
Yo mismo encontré estas respuestas el día pasado, tratando de encontrar una manera de copiar en profundidad estructuras complejas, que pueden incluir enlaces recursivos. Como no estaba satisfecho con nada de lo que se sugirió antes, implementé esta rueda yo mismo. Y funciona bastante bien. Espero que ayude a alguien.
Uso de ejemplo:
Consulte https://github.com/latitov/JS_DeepCopy para ver ejemplos en vivo de cómo usarlo, y también deep_print () está allí.
Si lo necesita rápido, aquí está la fuente de la función deep_copy ():
Salud@!
fuente
Aquí está mi algoritmo de copia profunda.
fuente
Aquí está la función deepClone que maneja todos los tipos de datos primitivos, matrices, objetos y funciones
fuente