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); 
     } 
    })) 
})) 

听起来像是要更换dayssessions这可能不是你想要做什么。

如果你的目标是建立visible真中的所有会话,你可以做这样的事情:

const state2 = state1.updateIn(
    ['event','days'], 
    days => days.map(
    day => day.update('sessions', 
     sessions => sessions.map(
     session => session.updateIn(['details', 'visible'], true) 
    ) 
    ) 
) 
);