2015-09-02 9 views
36

Podczas pracy z czystym JavaScripcie obiekty można łatwo zmienić głęboko zagnieżdżony właściwości obiektu:Jak ustawić głęboko zagnieżdżoną wartość w pliku Immutable.js?

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

Ale z Niezmienne muszę przejść przez przodków każdej nieruchomości przed mam nowy ludzie obiektu:

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

Czy istnieje bardziej elegancki sposób na napisanie tego?

Odpowiedz

54

map w niezmiennej mają setIn method który ułatwia ustawienie głębokie wartości:

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

Lub przy split do wygenerowania tablicy:

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

Jak można przełączać wartość logiczną używając setIn? Na przykład: peopleImmutable = peopleImmutable.setIn (["Thomas", hasNickName], toggleBooleanHere); –

+0

@ zero_cool: Przypuszczam, że peopleImmutable = peopleImmutable.setIn (["Thomas", "hasNickName"],! PeopleImmutable.getIn (["Thomas", "hasNickName"])); '(untested) –

+0

@VincentSels To działało idealnie! A co ze zmianą wszystkich boolów w głęboko zagnieżdżonym niezmiennym obiekcie z false na true w jednym bloku? Na przykład: options = fromJS ({one: {selected: false}, two: {selected: false}}). Jestem w React i próbuję iterować przez obiekt i użyć setIn, ale stan zostaje ustawiony tylko dla ostatniego zestawu kluczy. –

Powiązane problemy