根据对象属性更新对象数组中的项目

时间:2019-10-23 19:50:39

标签: javascript reactjs

我有一个具有以下结构的对象数组,如何基于一个对象属性(file)更新对象的数据(name)? 例如如何使用新的test1对象更新名为file的对象?

我已经尝试过,但是没有更新正确的对象,而是将新对象推送到数组,我在做什么错呢?

const [files, setFiles] = useState(fileArr)

const setFile = (name, data) => {
  setFiles(files => ({...files, [name]: {...files[name], ...data}}))
}

fileArr数组:

const fileArr= [
  {
    name: 'test1',
    status: 'Required',
    file: {}
  },
  {
    name: 'test2',
    status: 'Required',
    file: {}
  },
  {
    name: 'test3',
    status: 'Required',
    file: {}
  }
]

1 个答案:

答案 0 :(得分:3)

假定以下结构

const fileArr= [
  {
    name: 'test1',
    status: 'Required',
    file: {}
  },
  {
    name: 'test2',
    status: 'Required',
    file: {}
  },
  {
    name: 'test3',
    status: 'Required',
    file: {}
  }
]

基于name更新对象以替换file的正确方法是

const onChange = (name, data) =>{
    setItems(items => items.map(item =>{
        if(item.name === name)
            //assuming you want to spread instead of overwrite 'file'
            return {...item, file:{...item.file, ...data}}

        return item
    }))
}

您还用fileList初始化状态,根据您尝试更新的方式,该状态是object,但是您将fileArr作为数据结构发布了。因此,我假设您想在fileArr而非fileList中执行操作(我不知道它的外观)