如何使用Immutability helper更新数组中的嵌套对象?

时间:2017-01-31 03:56:10

标签: reactjs redux react-redux

在reducer里面,给出一个状态对象:

var state = {
        "data": [{
            "subset": [{
                "id": 1
            }, {
                "id": 2
            }]
        }, {
            "subset": [{
                "id": 10
            }, {
                "id": 11
            }, {
                "id": 12
            }]
        }]
    }

如您所见,数据是一个嵌套数组,每个元素都有数组。

知道action.indexToUpdate将是数据的索引,我想以编程方式将数据[action.indexToUpdate] .subset更新为新数组。例如,如果action.indexToUpdate = 0,则数据[0]将从

更新
[{"id":1},{"id":2}]

[{"id":4},{"id":5}]

为了做到这一点,我有:

let newSubset = [{"id":4},{"id":5}]
let newState = update(state.data[action.indexToUpdate], {
                subset: {
                    newSubset,
                },
            })

但是当我执行此操作时,它会返回错误:

TypeError: value is undefined

关于更新功能。

我一直在看这里的反应:https://facebook.github.io/react/docs/update.html但我无法弄清楚如何去做。请指教!

1 个答案:

答案 0 :(得分:11)

您的更新将如下所示

 var obj = {"state" : {
    "data": [{
        "subset": [{
            "id": 1
        }, {
            "id": 2
        }]
    }, {
        "subset": [{
            "id": 10
        }, {
            "id": 11
        }, {
            "id": 12
        }]
    }]
}}
return update(obj, {
  "state" : {
      "data": {
          [action.indexToUpdate]: {
            "subset": {
                 $set: [newSubset]
            }
          }
      }
  }
})

如果子集中有其他字段,但您只希望更改包含其他键的特定索引处的字段,则应编写

return update(obj, {
  "state" : {
      "data": {
          [action.indexToUpdate]: {
            "subset": {
                [id]: {$merge: newSubset}
            }
          }
      }
  }
})