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};
})