Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Immutablejs-使用Immutablejs更新深层嵌套树_Javascript_Reactjs_Immutability_Immutable.js - Fatal编程技术网

Javascript 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

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


谢谢

一个解决方案可能是当您返回时,用“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)
      )
    )
  )
);