Immutablejs - 使用immutablejs更新深层嵌套树
问题描述:
你好我正在尝试更新这个ImmutableJs树,但有一些问题,也许有人可以帮助我。Immutablejs - 使用immutablejs更新深层嵌套树
下面是代码:
let state = Immutable.Map();
var state1 = state.merge({
event: {
days: [
{
date: 1,
sessions: [
{
id: 1,
name: 2,
startTime: 1,
endTime: 1,
description: 1,
detailsLink: 1,
details: {visible: false}
},
{
id: 2,
name: 2,
startTime: 2,
endTime: 2,
description: 2,
detailsLink: 2,
details: {visible: false}
},
{
id: 3,
name: 3,
startTime: 3,
endTime: 3,
description: 3,
detailsLink: 3,
details: {visible: false}
}
]
},
{
date: 2,
sessions: [
{
id: 1,
name: 2,
startTime: 1,
endTime: 1,
description: 1,
detailsLink: 1,
details: {visible: false}
},
{
id: 2,
name: 2,
startTime: 2,
endTime: 2,
description: 2,
detailsLink: 2,
details: {visible: false}
},
{
id: 3,
name: 3,
startTime: 3,
endTime: 3,
description: 3,
detailsLink: 3,
details: {visible: false}
}
]
}
]
}
});
const state2 = state1.setIn(['event','days'], state1.getIn(['event','days']).map(day => {
return day.get('sessions').map(session => {
let isVisible = session.get('details').toJS();
if(!isVisible.visible) {
return session.setIn(['details','visible'],true);
}
})
}))
console.log(state1.toJS());
console.log(state2.toJS());
我能够更新集合。问题是这两棵树不再一样了。在第一个日期键是一个对象,在第二个日期键是一个数组。
我知道问题与days.get('会话')返回一个列表,而不是地图。但不知道如何使其工作。
这是一个jsbin的代码。
https://jsbin.com/mejaxelobe/1/edit?html,js,output
感谢
答
之一,当您返回解决方案可能是,以 “Immutable.Map” 包装呢?例如,以下??
const state2 = state1.setIn(['event','days'], state1.getIn(['event','days']).map(day => {
return Immutable.Map(day.get('sessions').map(session => {
let isVisible = session.get('details').toJS();
if(!isVisible.visible) {
return session.setIn(['details','visible'],true);
}
}))
}))
答
听起来像是要更换days
与sessions
这可能不是你想要做什么。
如果你的目标是建立visible
真中的所有会话,你可以做这样的事情:
const state2 = state1.updateIn(
['event','days'],
days => days.map(
day => day.update('sessions',
sessions => sessions.map(
session => session.updateIn(['details', 'visible'], true)
)
)
)
);