使用immutability helper修改数组的每个值

时间:2017-01-18 22:15:26

标签: javascript arrays reactjs immutability

我正在努力弄清楚使用immutability helper修改对象数组中的每个值的最佳做法。

例如,如果我在我的州里有这个:

[[Double]]

我想将每个this.state = { items: [ { name: "test", subItems: [ {val: false}, {val: true}, {val: false} ] }, { name: "test2", subItems: [ {val: true}, {val: true}, {val: false} ] } ] } 设置为val,我该怎么做。

我可以一次做一个,但必须有更好的方法:

false

3 个答案:

答案 0 :(得分:5)

这当然是可能的,但它是一切只有可读或可以理解的一切。

const nextState = update(state, {
    items: {
    $apply: (items) => {
        return items.map(item => {
        return update(item, {
            subItems: {
            $apply: (subItems) => {
                return subItems.map(subItem => {
                return update(subItem, {
                    val: {
                    $set: false
                  }
                })
              })
            }
          }
        })
      })
    }
  }
});

答案 1 :(得分:2)

对于具有不变性的ES6解决方案,destructuring并且没有帮助者:

this.setState({
  // This is if you have other state besides items.
  ...this.state,
  items: this.state.items.map(item => ({
    ...item,
    subItems: item.subItems.map(subItem => ({
      ...subItem,
      val: false // or e.g. setter as a function of (item, subItem)
    }))
  }))
});
我的眼睛比更新助手更容易。

答案 2 :(得分:0)

试试这个

this.state = {
    items: [
        {
            name: "test",
            subItems: [
                {val: false}, {val: true}, {val: false}
            ]
        },
        {
            name: "test2",
            subItems: [
                {val: true}, {val: true}, {val: false}
            ]
        }
    ]
}

使用函数式编程

this.state.items
.filter((item) => item.name === test).subitems
.map((subItem) => {
  subitem.forEach( (key) => {
   { [key]: !subitem[key] }

})
})