var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
Wyjaśnienie
Aktualizowanie kolekcji Immutable.js zawsze zwraca nowe wersje tych kolekcji, pozostawiając oryginał niezmieniony. Z tego powodu nie możemy używać list[2].count = 4
składni mutacji JavaScript . Zamiast tego musimy wywołać metody, podobnie jak w przypadku klas kolekcji Java.
Zacznijmy od prostszego przykładu: tylko liczby na liście.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
Teraz, jeśli chcemy, aby zaktualizować 3rd element, zwykły tablica JS może wyglądać tak: counts[2] = 4
. Ponieważ nie możemy użyć mutacji i musimy wywołać metodę, zamiast tego możemy użyć: counts.set(2, 4)
- oznacza to ustawienie wartości 4
w indeksie 2
.
Głębokie aktualizacje
Jednak podany przykład zawiera zagnieżdżone dane. Nie możemy po prostu użyć set()
na początkowej kolekcji.
Kolekcje Immutable.js mają rodzinę metod, których nazwy kończą się na „In”, które umożliwiają wprowadzanie głębszych zmian w zagnieżdżonym zestawie. Większość popularnych metod aktualizacji ma powiązaną metodę „In”. Na przykład set
jest setIn
. Zamiast akceptować indeks lub klucz jako pierwszy argument, te metody „In” akceptują „ścieżkę klucza”. Ścieżka klucza to tablica indeksów lub kluczy, która ilustruje, jak dotrzeć do wartości, którą chcesz zaktualizować.
W naszym przykładzie chciałeś zaktualizować element na liście pod indeksem 2, a następnie wartość w kluczu „count” w tym elemencie. Więc kluczowa ścieżka byłaby [2, "count"]
. Drugi parametr setIn
metody działa tak samo set
, jest to nowa wartość, którą chcemy tam umieścić, więc:
list = list.setIn([2, "count"], 4)
Znalezienie właściwej ścieżki klucza
Idąc o krok dalej, powiedziałeś, że chcesz zaktualizować element, którego nazwa to „trzy”, co różni się od trzeciego elementu. Na przykład, może Twoja lista nie jest posortowana, a może element o nazwie „dwa” został wcześniej usunięty? Oznacza to, że najpierw musimy się upewnić, że faktycznie znamy prawidłową ścieżkę klucza! W tym celu możemy użyć findIndex()
metody (która, nawiasem mówiąc, działa prawie dokładnie tak jak Array # findIndex ).
Po znalezieniu indeksu na liście zawierającego element, który chcemy zaktualizować, możemy podać ścieżkę klucza do wartości, którą chcemy zaktualizować:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB: Set
vsUpdate
Oryginalne pytanie dotyczy metod aktualizacji, a nie metod zestawu. Wyjaśnię drugi argument w tej funkcji (nazywany updater
), ponieważ różni się od set()
. Podczas gdy drugi argument set()
to nowa wartość, której szukamy, drugi argument update()
to funkcja, która przyjmuje poprzednią wartość i zwraca nową, którą chcemy. Następnie updateIn()
jest wariantem „In”, update()
który akceptuje ścieżkę klucza.
Załóżmy na przykład, że chcieliśmy mieć odmianę twojego przykładu, która nie tylko ustawia liczbę na 4
, ale zamiast tego zwiększa istniejącą liczbę, możemy zapewnić funkcję, która dodaje ją do istniejącej wartości:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)