2015-10-26 48 views
1

你好我正在嘗試更新這個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

感謝

回答

0

之一,當您返回解決方案可能是,以 「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); 
     } 
    })) 
})) 
1

聽起來像是要更換dayssessions這可能不是你想要做什麼。

如果你的目標是建立visible真中的所有會話,你可以做這樣的事情:

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