Javascript Immutablejs-使用Immutablejs更新深层嵌套树
您好,我正在尝试更新此ImmutableJs树,但遇到一些问题,可能有人可以帮助我解决 代码如下:Javascript Immutablejs-使用Immutablejs更新深层嵌套树,javascript,reactjs,immutability,immutable.js,Javascript,Reactjs,Immutability,Immutable.js,您好,我正在尝试更新此ImmutableJs树,但遇到一些问题,可能有人可以帮助我解决 代码如下: let state = Immutable.Map(); var state1 = state.merge({ event: { days: [ { date: 1, sessions: [ { id
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
谢谢一个解决方案可能是当您返回时,用“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);
}
}))
}))
听起来好像你正在用
会话
取代天
,这可能不是你想要做的
如果您的目标是在所有会话中设置可见
为真,则可以执行以下操作:
const state2 = state1.updateIn(
['event','days'],
days => days.map(
day => day.update('sessions',
sessions => sessions.map(
session => session.updateIn(['details', 'visible'], true)
)
)
)
);