var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
açıklama
Immutable.js koleksiyonlarının güncellenmesi, her zaman orijinali değiştirmeden bırakarak bu koleksiyonların yeni sürümlerini döndürür. Bu nedenle JavaScript'in list[2].count = 4
mutasyon sözdizimini kullanamıyoruz . Bunun yerine, Java toplama sınıflarında yapabileceğimiz gibi, yöntemleri çağırmamız gerekir.
Daha basit bir örnekle başlayalım: sadece bir listedeki sayılar.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
Biz 3 maddeyi güncelleştirmek isteseydim, düz JS dizi gibi görünebilir: counts[2] = 4
. Mutasyonu kullanamadığımızdan ve bir yöntem çağırmamız gerektiğinden, bunun yerine şunu kullanabiliriz: counts.set(2, 4)
- bu 4
, dizindeki değeri ayarlamak anlamına gelir 2
.
Derin güncellemeler
Verdiğiniz örnekte iç içe geçmiş veriler var. set()
İlk koleksiyonda kullanamayız .
Immutable.js koleksiyonları, iç içe geçmiş bir kümede daha derin değişiklikler yapmanıza olanak tanıyan "In" ile biten adlara sahip bir yöntem ailesine sahiptir. En yaygın güncelleme yöntemlerinin ilgili bir "Giriş" yöntemi vardır. Örneğin set
var setIn
. Bir indeksi veya anahtarı ilk argüman olarak kabul etmek yerine, bu "Giriş" yöntemleri bir "anahtar yolu" kabul eder. Anahtar yolu, güncellemek istediğiniz değere nasıl ulaşılacağını gösteren bir dizi dizin veya anahtar dizisidir.
Örneğinizde, 2. dizindeki listedeki öğeyi ve ardından bu öğe içindeki "say" anahtarındaki değeri güncellemek istediniz. Yani anahtar yol olacaktır [2, "count"]
. setIn
Yöntemin ikinci parametresi tıpkı set
oraya koymak istediğimiz yeni değer gibi çalışır , yani:
list = list.setIn([2, "count"], 4)
Doğru anahtar yolunu bulmak
Bir adım daha ileri giderek , adı "üç" olan öğeyi güncellemek istediğinizi söylediniz , bu yalnızca 3. öğeden farklıdır. Örneğin, listeniz sıralanmamış olabilir veya belki de "iki" adlı öğe daha önce kaldırılmıştır. Bu, öncelikle doğru anahtar yolunu bildiğimizden emin olmamız gerektiği anlamına gelir! Bunun için findIndex()
yöntemi kullanabiliriz (bu arada, neredeyse tam olarak Array # findIndex gibi çalışır ).
Listede güncellemek istediğimiz öğenin bulunduğu dizini bulduğumuzda, güncellemek istediğimiz değere giden anahtar yolu sağlayabiliriz:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB: Set
vsUpdate
Orijinal soru, ayarlanan yöntemlerden çok güncelleme yöntemlerinden bahseder. Bu işlevdeki ikinci argümanı (çağrılan updater
) açıklayacağım , çünkü ondan farklı set()
. İkinci argüman set()
istediğimiz yeni değer iken, ikinci argüman önceki değeri kabul eden ve istediğimiz yeni değeri döndüren update()
bir fonksiyondur . Daha sonra, anahtar yolu kabul eden updateIn()
"Giriş" varyasyonudur update()
.
Örneğin, örneğinizin yalnızca sayıyı ayarlamakla kalmayan 4
, bunun yerine mevcut sayımı artıran bir varyasyonunu istediğimizi varsayalım, mevcut değere bir ekleyen bir işlev sağlayabiliriz:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)