2016-03-24 42 views
1

我試圖修改OrderedMap的所有記錄的'completed'屬性。這是OrderedMap:immutable js修改所有嵌套記錄

const TodoItem = Record({text: '', completed: false}); 
let state = OrderedMap({'0': new TodoItem({text: 'First Item'})}); 

我當前的代碼是:

state.forEach((v,k) => { 
    state = state.updateIn([k.toString(),'completed'], completed => true); 
}); 
return state; 

這工作,但如何?

它是否工作,因爲狀態是不可變的,並且在第一次迭代之後,forEach在第一個狀態obj上運行,它現在是匿名的?

是否有任何其他更好的可能性來修改所有嵌套元素的屬性?

+0

哪裏是混亂呢? state.forEach通過OrderedMap進行迭代,在forEach調用期間分配,即如果您在forEach中更改狀態(如add/remove Record)forEach將繼續使用原始狀態實例進行迭代。 – IL55

+0

沒有真正的混淆,我只是問自己,如果這是在性能方面最好的方式來爲每個更新生成一個新的映射,以便對不可變結構進行更新。 – duke2

回答

1

是的,有 -

state = state.map((todoItem)=>todoItem.set("completed", true)); 
+1

明智的答案。謝謝! –