更改redux reducer中对象数组中键的值

时间:2018-03-28 04:43:19

标签: reactjs ecmascript-6 react-redux

我的数组是这样的:

var arrayObj = [{key1:'value1', key2:'value2'},{key1:'value1', key2:'value2'},{key1:'value1', key2:'value2'},{key1:'value1', key2:'value2'},{key1:'value1', key2:'value2'}];

我发送索引,密钥和值。

假设我将发送(2,'key2','hello')然后reducer更新上面的数组:

var arrayObj = [{key1:'value1', key2:'value2'},{key1:'value1', key2:'value2'},{key1:'value1', key2:'hello'},{key1:'value1', key2:'value2'},{key1:'value1', key2:'value2'}];

所有数据都在action.payload中。 我尝试过这样的事情:

 return {
   ...state,
   arrayObj: [
    ...state.arrayObj.slice(0, action.payload.arrayObjIndex),
    ...state.arrayObj[action.payload.arrayObjIndex]: {
      ...state.arrayObj[action.payload.arrayObjIndex],
      [action.payload.key]: action.payload.value,
    },
    ...state.arrayObj.slice(action.payload.arrayObjIndex + 1),
   ],
  };

但是上面的那个没有用。

2 个答案:

答案 0 :(得分:2)

代码问题 - 从正在更新的对象中删除...,因为您需要传播数组(由切片返回),而不是对象。使用此:

 return {
   ...state,
   arrayObj: [
    ...state.arrayObj.slice(0, action.payload.arrayObjIndex),
    {
      ...state.arrayObj[action.payload.arrayObjIndex],
      [action.payload.key]: action.payload.value,
    },
    ...state.arrayObj.slice(action.payload.arrayObjIndex + 1),
   ],
};

建议/其他可能的解决方案:

如果你知道索引,那么你可以直接更新对象,比如

case "String" : {
  let arr = [...state.arrayObj]
  arr[index] = {...arr[index]}        // Object.assign({}, arr[index])
  arr[index][key] = value
  return {
    ...state,
    arrayObj: arr
  }
}

或者

case "String" : {
  let arr = [...state.arrayObj]
  arr[index] = {...arr[index], [key]: value}     // Object.assign({}, arr[index], {[key]: value})
  return {
    ...state,
    arrayObj: arr
  }
}

您也可以使用地图或findIndex,如果项目的索引未知,请查看以下答案:

Update single value of array in redux reducer

答案 1 :(得分:0)

您可以通过以下方式执行此操作:

let prevState = {...state};

prevState.arrayObj[action.payload.arrayObjIndex][action.payload.key] = action.payload.value;

return prevState;