2015-09-02 49 views
36

當使用普通的JavaScript合作對象很容易改變一個深深嵌入對象屬性:如何在Immutable.js中設置深度嵌套值?

people.Thomas.nickname = "Mr. T"; 

但隨着不可改變我不得不通過每個屬性的祖先之前,我有一個新的人反對:

var thomas = peopleImmutable.get("Thomas"); 
var newThomas = thomas.set("nickname", "Mr .T"); 
peopleImmutable = peopleImmutable.set("Thomas", newThomas); 

有沒有更優雅的寫法呢?

回答

54

地圖中不可變的有setIn method,可以很容易設置深值:

peopleImmutable = peopleImmutable.setIn(["Thomas", "nickname"], "Mr. T"); 

或者,使用split生成數組:

peopleImmutable = peopleImmutable.setIn("Thomas.nickname".split("."), "Mr. T"); 
+0

你會如何切換使用SETIN一個布爾值?例如:peopleImmutable = peopleImmutable.setIn([「Thomas」,hasNickName],toggleBooleanHere); –

+0

@zero_cool:我想peopleImmutable = peopleImmutable.setIn(![ 「托馬斯」, 「hasNickName」],peopleImmutable.getIn([ 「托馬斯」, 「hasNickName」));'(未經測試) –

+0

@VincentSels這完美地工作!在一個塊中,將深度嵌套的不可變對象中的所有布爾變量從false更改爲true,如何呢?例如:options = fromJS({one:{selected:false},two:{selected:false}})。我在React中,並試圖迭代對象,並使用setIn,但僅爲最後一個鍵集設置了狀態。 –