【发布时间】:2016-11-19 20:08:30
【问题描述】:
我正在尝试为我的 Redux 项目创建一个深拷贝映射方法,该方法将使用对象而不是数组。我读到在 Redux 中,每个状态都不应该改变之前的状态。
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
output[key] = callback.call(this, {...object[key]});
return output;
}, {});
}
有效:
return mapCopy(state, e => {
if (e.id === action.id) {
e.title = 'new item';
}
return e;
})
但是它不会深度复制内部项目,所以我需要将其调整为:
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;
}, {});
}
这不太优雅,因为它需要知道传递了哪些对象。 ES6 中有没有办法使用扩展语法来深度复制对象?
【问题讨论】:
-
这是一个 XY 问题。您不必在 redux 中的深层属性上做太多工作。相反,您应该只创建另一个在状态形状的子切片上工作的减速器,然后使用
combineReducers将两个(或更多)组合在一起。如果您使用惯用的 redux 技术,您的深度克隆对象问题就会消失。 -
“在 ES6 中有没有办法使用扩展语法来深度复制一个对象?”。对于一般情况,不可能。在任何级别的顶部调用展开语法会覆盖应合并的具有深度的属性。
标签: javascript ecmascript-6 redux spread-syntax