您好,我正在尝试更新此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/

10-11 00:51