Javascript 扩展省略不';t忽略操作处理程序内的属性
我觉得我快疯了,下面的代码在reducer中使用时根本不起作用,但是在控制台或游乐场中使用完全相同的变量运行它绝对是完美的Javascript 扩展省略不';t忽略操作处理程序内的属性,javascript,redux,Javascript,Redux,我觉得我快疯了,下面的代码在reducer中使用时根本不起作用,但是在控制台或游乐场中使用完全相同的变量运行它绝对是完美的 [MutationTypes.DELETE_GOALS_SUCCESS]: (state, { payload }) => { //payload is {deleted_goals: [1, 2, 3]}, goals is {1: {...}, 2: {...}, ... n: {...}} const goals = { ...state.goals }
[MutationTypes.DELETE_GOALS_SUCCESS]: (state, { payload }) => {
//payload is {deleted_goals: [1, 2, 3]}, goals is {1: {...}, 2: {...}, ... n: {...}}
const goals = { ...state.goals };
const newGoals = payload.deleted_goals.reduce((acc, id) => {
const { [id]: omitted, ...newAcc } = acc; //newAcc still contains "id" key
console.log(
"After spread",
"New goals:",
newAcc,
"Old goals:",
acc, //acc and newAcc are the same aside from different pointers
"Removed goal",
omitted,
);
return newAcc;
}, goals);
return {
...state,
goals: newGoals,
};
},
const{[id]:省略,…newAcc}=acc代码>部分就是不能按预期工作的部分。出于某种原因,newAcc仍然包含id
键,因此每次迭代它都保持不变。id
键包含在目标对象中,我可以记录省略的
对象。
正如我所说的,我可以在其他任何地方使用完全相同的变量运行完全相同的代码行,它将完美地工作。这可能与redux或我的reducer实现有关,但我无法想象会出现什么错误以及它如何导致这样的后果。状态只是一个普通的对象,状态。目标也是一个普通的对象,我甚至在做一个简单的复制。我可以JSON.stringify
它们,复制粘贴到其他地方,然后像我在这里做的那样省略,它会工作的。
知道是什么导致了这种奇怪的互动吗?在不扩散的情况下,有多种解决方法可以做到这一点,比如使用delete操作符,或者从头开始构造新对象,但我想知道为什么对象会对扩散破坏“免疫”
我试着在action handler和reduce回调中省略spread on fresh对象,它成功了,看起来这个特定对象(state.goals)有一些东西。然而,它只是一个类似于映射的对象,其结构如下:id1:{goalwithid},id2:{goalwithid2}…}
id1,id2等都是数字
刚刚尝试了深度克隆对象(将const-goals={…state.goals};
替换为const-goals=.\uu.cloneDeep(state.goals)
,它不会改变任何东西。为什么不这样做:
[MutationTypes.DELETE_GOALS_SUCCESS]: (state, { payload }) => {
//payload is {deleted_goals: [1, 2, 3]}, goals is {1: {...}, 2: {...}, ... n: {...}}
const goals = state.goals;
const newGoals = Object.keys(goals).reduce((acc, key) => {
if(payload.deleted_goals.includes(parseInt(key))) {
return acc;
} else {
return (acc[key] = goals[key], acc);
}
}, {})
return {
...state,
goals: newGoals,
};
},
是的,这很有效,谢谢。但是我想知道为什么初始方法(在我看来更优雅)不起作用。@Supremus是deleted_goals
number或string中的元素?它是数字。js也可以毫无问题地检测我指的是哪个键,它成功地将省略的值设置为goals[id]值,但不要将其从目标中忽略。如果使用我的方式(更新了我的答案),则可能需要添加parseInt
。关于代码中的问题,我不完全确定,但您可以创建一个stackblitz实例来复制此问题,我将对此进行研究。您是否也可以使用您在reduce
中记录的日志更新此问题?