Javascript 扩展省略不';t忽略操作处理程序内的属性

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 }

我觉得我快疯了,下面的代码在reducer中使用时根本不起作用,但是在控制台或游乐场中使用完全相同的变量运行它绝对是完美的

[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
中记录的日志更新此问题?