您好,我正在尝试更新此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键是一个对象,在第二个中,days键是一个数组。
我知道问题在于使用days.get('session')返回列表而不是地图。但不确定如何使其工作。
这是代码的jsbin。
https://jsbin.com/mejaxelobe/1/edit?html,js,output
谢谢
最佳答案
听起来您正在用days
替换sessions
,这可能不是您想要的。
如果您的目标是在所有会话中将visible
设置为true,则可以执行以下操作:
const state2 = state1.updateIn(
['event','days'],
days => days.map(
day => day.update('sessions',
sessions => sessions.map(
session => session.updateIn(['details', 'visible'], true)
)
)
)
);
关于javascript - Immutablejs-使用immutablejs更新深层嵌套树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33356129/