我有一个看起来像这样的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
谢谢!
答案 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的工作方式。您需要使用新元素更新整个状态对象。