Sto provando a creare un metodo di copia di una mappa profonda per il mio progetto Redux che funzionerà con gli oggetti piuttosto che con gli array. Ho letto che in Redux ogni stato non dovrebbe cambiare nulla negli stati precedenti.Copia profonda in ES6 utilizzando il simbolo di diffusione
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
output[key] = callback.call(this, {...object[key]});
return output;
}, {});
}
Funziona:
return mapCopy(state, e => {
if (e.id === action.id) {
e.title = 'new item';
}
return e;
})
Tuttavia esso elementi interni non copia completa quindi ho bisogno di modificarlo per:
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;
}, {});
}
Questo è meno elegante in quanto richiede di sapere che gli oggetti sono passati. Esiste un modo in ES6 per utilizzare il segno di diffusione per copiare in profondità un oggetto?
Vedere http://stackoverflow.com/questions/27936772/deep-object-merging-in-es6-es7. –
Questo è un problema XY. Non dovresti lavorare molto su proprietà profonde in redux. invece dovresti semplicemente creare un altro riduttore che lavori sulla sezione figlio della forma di stato e quindi usare 'combinaRiduttori 'per comporre i due (o più) insieme. Se usi tecniche di ridondanza idiomatica, il tuo problema di oggetti di clonazione profonda scompare. – naomik