Estou tentando criar um método de mapa de cópia profunda para meu projeto Redux que funcionará com objetos em vez de matrizes. Eu li que no Redux cada estado não deve mudar nada nos 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;
})
No entanto, ele não copia profundamente os itens internos, então preciso ajustá-lo 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;
}, {});
}
Isso é menos elegante, pois requer saber quais objetos são passados. Existe uma maneira no ES6 de usar a sintaxe de propagação para copiar um objeto em profundidade?
combineReducers
para compor os dois (ou mais) juntos. Se você usar técnicas de redux idiomática, seu problema de clonagem profunda de objetos desaparece.