更新列表中对象的字段
Update a field of an object in a list
我有一个道具,它是一个对象列表。我的减速器旨在更新对象的某个字段并将其附加到列表中,要更新的值是通过 action.payload 提供的(这是商店的另一个道具) .
我知道只要将对象添加到列表中,我就可以像这样使用扩展运算符
function myReducer(state=[],action){
case something:
return [...state,action.payload];
case default:
return state;
}
但是说我有一个更改 action.payload.aCertainField
然后将其附加到对象列表中。当我做这样的事情时:
action.payload.aCertainField = aCertainValue;
return [...state,action.payload];
但它实际上也改变了另一个道具的 aCertainField
。我不要那个。有解决办法吗?
您可以使用 ES6 执行以下操作:
let { aCertainField, id } = action.payload.obj;
//find the index of object in that array hoping the id is unique for the object
let indexOfObject = state.findIndex( (item) => item.id === id );
let actualObject = Object.assign({}, state[indexOfObject], { aCertainField });
return [
...state.slice(0, indexOfObject),
actualObject,
...state.slice(indexOfObject+1)
]
注意:认为 id 是对象结构的唯一键,aCertainField 是要更新的值
我有一个道具,它是一个对象列表。我的减速器旨在更新对象的某个字段并将其附加到列表中,要更新的值是通过 action.payload 提供的(这是商店的另一个道具) .
我知道只要将对象添加到列表中,我就可以像这样使用扩展运算符
function myReducer(state=[],action){
case something:
return [...state,action.payload];
case default:
return state;
}
但是说我有一个更改 action.payload.aCertainField
然后将其附加到对象列表中。当我做这样的事情时:
action.payload.aCertainField = aCertainValue;
return [...state,action.payload];
但它实际上也改变了另一个道具的 aCertainField
。我不要那个。有解决办法吗?
您可以使用 ES6 执行以下操作:
let { aCertainField, id } = action.payload.obj;
//find the index of object in that array hoping the id is unique for the object
let indexOfObject = state.findIndex( (item) => item.id === id );
let actualObject = Object.assign({}, state[indexOfObject], { aCertainField });
return [
...state.slice(0, indexOfObject),
actualObject,
...state.slice(indexOfObject+1)
]
注意:认为 id 是对象结构的唯一键,aCertainField 是要更新的值