使用深度嵌套的地图/列表链接Immutable.js方法

时间:2016-06-25 03:47:06

标签: javascript immutable.js

我有一个看起来像这样的Immutable.js集合:

@SpringBootApplication

我从我的服务器获取更新的成员数组和组ID。如何通过id找到正确的组,然后更新成员prop,然后返回一个新的{ groups: Immutable.Map({ { id: 1, members: Immutable.List },{ id: 2, members: Immutable.List } }) } 集合?

到目前为止我有类似的东西,但是没有用。

groups

此外,尝试了这个并且它似乎没有完成,因为return state.update('groups', groups => { for (let group of groups) { if (group.id === action.id) { group.members = Immutable.fromJS(action.members); // not sure what I would do with updated here //const updated = group.members.set('members', action.members); } } return groups; }; 永远不会触发。

console.log

以下是有效的,但必须采用比使用 let update = state.get('groups') .find(group => group.id === action.id) .set('members', action.members) console.log(update) // nothing, no error either 然后使用fromJS更好,更优雅的方式。

toJS

谢谢!

1 个答案:

答案 0 :(得分:0)

这样可行:

return state.update('groups', groups => {
    return groups.map(group => {
        if (group.get('id') === action.id) {
            return group.set('members', Immutable.fromJS(action.members))
        } else {
            return group
        }
    })
})

您还可以使用findIndex获取匹配组ID的索引,然后使用setIn更新成员数组:

const updateIndex = state.get('groups').findIndex(group => group.get('id') === action.id);
if (updateIndex === -1) { // action.id not found
    return state;
} else {
    return state.setIn(['groups',updateIndex,'members'], Immutable.fromJS(action.members))
}

您的示例失败是因为您尝试直接修改子元素,而不是Immutable的工作方式。您需要使用新元素更新整个状态对象。