Sto cercando di creare un metodo di mappa di copia 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.
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 non copia in profondità gli elementi interni, quindi devo 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 quali oggetti vengono passati. C'è un modo in ES6 per utilizzare la sintassi di diffusione per copiare in profondità un oggetto?
combineReducers
per comporre i due (o più) insieme. Se usi tecniche di redux idiomatiche, il tuo problema di clonazione profonda degli oggetti scompare.