我的数组是这样的:
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),
],
};
但是上面的那个没有用。
答案 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
,如果项目的索引未知,请查看以下答案:
答案 1 :(得分:0)
您可以通过以下方式执行此操作:
let prevState = {...state};
prevState.arrayObj[action.payload.arrayObjIndex][action.payload.key] = action.payload.value;
return prevState;