var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
Penjelasan
Memperbarui koleksi Immutable.js selalu mengembalikan versi baru dari koleksi tersebut tanpa meninggalkan perubahan. Karena itu, kami tidak dapat menggunakan JavaScriptlist[2].count = 4
sintaks mutasi . Sebaliknya kita perlu memanggil metode, seperti yang mungkin kita lakukan dengan kelas koleksi Java.
Mari kita mulai dengan contoh yang lebih sederhana: hitung saja dalam daftar.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
Sekarang jika kita ingin memperbarui item 3, JS array yang polos akan terlihat seperti: counts[2] = 4
. Karena kita tidak dapat menggunakan mutasi, dan perlu memanggil metode, sebaliknya kita dapat menggunakan: counts.set(2, 4)
- itu berarti mengatur nilai 4
pada indeks2
.
Pembaruan mendalam
Contoh yang Anda berikan memiliki data bersarang. Kami tidak bisa hanya menggunakanset()
koleksi awal.
Koleksi Immutable.js memiliki kumpulan metode dengan nama yang diakhiri dengan "In" yang memungkinkan Anda untuk membuat perubahan yang lebih dalam pada kumpulan yang disarangkan. Metode pemutakhiran yang paling umum memiliki metode "Dalam" yang terkait. Misalnya set
adasetIn
. Alih-alih menerima indeks atau kunci sebagai argumen pertama, metode "Dalam" ini menerima "jalur kunci". Jalur kunci adalah larik indeks atau kunci yang menggambarkan cara mencapai nilai yang ingin Anda perbarui.
Dalam contoh Anda, Anda ingin memperbarui item dalam daftar di indeks 2, dan kemudian nilai pada kunci "hitung" dalam item itu. Jadi jalan kuncinya adalah [2, "count"]
. Parameter kedua untuk setIn
metode ini berfungsi seperti set
, ini adalah nilai baru yang ingin kita taruh di sana, jadi:
list = list.setIn([2, "count"], 4)
Menemukan jalur kunci yang tepat
Selangkah lebih maju, Anda sebenarnya mengatakan Anda ingin memperbarui item yang namanya "tiga" yang berbeda dari item ke-3. Misalnya, mungkin daftar Anda tidak diurutkan, atau mungkin ada item bernama "dua" telah dihapus sebelumnya? Itu berarti pertama-tama kita perlu memastikan kita benar-benar mengetahui jalur kunci yang benar! Untuk ini kita dapat menggunakan findIndex()
metode (yang, omong-omong, bekerja hampir persis seperti Array # findIndex ).
Setelah kami menemukan indeks dalam daftar yang memiliki item yang ingin kami perbarui, kami dapat memberikan jalur kunci ke nilai yang ingin kami perbarui:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB: Set
vsUpdate
Pertanyaan aslinya menyebutkan metode pembaruan daripada metode yang ditetapkan. Saya akan menjelaskan argumen kedua dalam fungsi itu (dipanggil updater
), karena berbeda dari set()
. Sementara argumen kedua set()
adalah nilai baru yang kita inginkan, argumen kedua update()
adalah fungsi yang menerima nilai sebelumnya dan mengembalikan nilai baru yang kita inginkan. Kemudian, updateIn()
adalah variasi "Dalam" dariupdate()
yang menerima jalur kunci.
Misalnya, kami ingin variasi contoh Anda yang tidak hanya mengatur penghitungan 4
, tetapi sebagai tambahan penghitungan yang ada, kami dapat menyediakan fungsi yang menambahkan satu ke nilai yang ada:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)