Javascript 替换状态数组中的项
我已经研究了一段时间,如果该项已经存在于状态数组中,如何替换该项,但我找不到一个缓和的解决方案Javascript 替换状态数组中的项,javascript,reactjs,Javascript,Reactjs,我已经研究了一段时间,如果该项已经存在于状态数组中,如何替换该项,但我找不到一个缓和的解决方案 如果项目已经存在,我如何更新该项目?您可以找到该项目,只需使用object.assign更新即可 let newUser1 = { "userId": 1, "id": 2, "title": "Two New", "body": "new data" } this.setState(prevState => {
如果项目已经存在,我如何更新该项目?您可以找到该项目,只需使用object.assign更新即可
let newUser1 = {
"userId": 1,
"id": 2,
"title": "Two New",
"body": "new data"
}
this.setState(prevState => {
let newData = prevState.data;
let user = newData.find(d => d.id === newUser1.id);
Object.assign(user, newUser1);
return {data: newData};
})
您必须递归地创建深度副本,然后更新状态 注意:
slice
函数不会创建深度复制,因此您必须创建一个新对象。(我使用扩展运算符,还有另一种选择,例如Object.assign()
)
下面是根据您的问题测试的代码:
add=()=>{
this.setState(prevState=>{
const idx=prevState.data.findIndex(item=>item.id==2);
const nextData=prevState.data.slice();
const nextItem={…nextData[idx]};
nextItem.title=“哇!新两个”;
nextData[idx]=nextItem;
返回{
数据:nextData,
};
});
};
在数据
数组对象中,id
是否唯一?如果数组中不存在该项,如何添加新项?我遇到错误“无法将未定义或空值转换为对象”
请检查它是否存在,如果确实存在object.assign,如果它不执行newData.push
或过滤id不是newUser1.id的对象的prevState.data,则无论其是否存在,都要推送newUser1.id。
add = () => {
this.setState(prevState => ({
data: prevState.data.filter(item => this.state.data.indexOf(item.id) !== -1).slice(0, 5), // this not working
data: [...prevState.data,
{
"userId": 1,
"id": 2,
"title": "Two New",
"body": "new data"
}
]
}))
};
let newUser1 = {
"userId": 1,
"id": 2,
"title": "Two New",
"body": "new data"
}
this.setState(prevState => {
let newData = prevState.data;
let user = newData.find(d => d.id === newUser1.id);
Object.assign(user, newUser1);
return {data: newData};
})