Inilah yang dikatakan oleh dokumen resmi
updateIn(keyPath: Array<any>, updater: (value: any) => any): List<T>
updateIn(keyPath: Array<any>, notSetValue: any, updater: (value: any) => any): List<T>
updateIn(keyPath: Iterable<any, any>, updater: (value: any) => any): List<T>
updateIn(keyPath: Iterable<any, any>, notSetValue: any, updater: (value: any) => any): List<T>
Tidak mungkin pengembang web normal (bukan programmer fungsional) akan mengerti itu!
Saya memiliki kasus yang cukup sederhana (untuk pendekatan non-fungsional).
var arr = [];
arr.push({id: 1, name: "first", count: 2});
arr.push({id: 2, name: "second", count: 1});
arr.push({id: 3, name: "third", count: 2});
arr.push({id: 4, name: "fourth", count: 1});
var list = Immutable.List.of(arr);
Bagaimana saya dapat memperbarui di list
mana elemen dengan nama ketiga memiliki count set ke 4 ?
javascript
functional-programming
immutable.js
Vitalii Korsakov
sumber
sumber
Jawaban:
Kasus yang paling tepat adalah menggunakan keduanya
findIndex
danupdate
metode.PS Tidak selalu mungkin menggunakan Maps. Misalnya, jika nama tidak unik dan saya ingin memperbarui semua item dengan nama yang sama.
sumber
Dengan .setIn () Anda dapat melakukan hal yang sama:
Jika kami tidak tahu indeks entri yang ingin kami perbarui. Cukup mudah untuk menemukannya menggunakan .findIndex () :
Semoga ini bisa membantu!
sumber
{ }
di dalamfromJS( )
, tanpa kawat gigi itu tidak valid JS.Penjelasan
Memperbarui koleksi Immutable.js selalu mengembalikan versi baru dari koleksi tersebut tanpa meninggalkan perubahan. Karena itu, kami tidak dapat menggunakan JavaScript
list[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.
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 nilai4
pada indeks2
.Pembaruan mendalam
Contoh yang Anda berikan memiliki data bersarang. Kami tidak bisa hanya menggunakan
set()
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 untuksetIn
metode ini berfungsi sepertiset
, ini adalah nilai baru yang ingin kita taruh di sana, jadi: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:
NB:
Set
vsUpdate
Pertanyaan aslinya menyebutkan metode pembaruan daripada metode yang ditetapkan. Saya akan menjelaskan argumen kedua dalam fungsi itu (dipanggil
updater
), karena berbeda dariset()
. Sementara argumen keduaset()
adalah nilai baru yang kita inginkan, argumen keduaupdate()
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:sumber
Anda tidak perlu
updateIn
, yang hanya untuk struktur bersarang. Anda sedang mencariupdate
metode ini , yang memiliki tanda tangan dan dokumentasi yang jauh lebih sederhana:yang, seperti yang disarankan
Map::update
dokumen , adalah " setara dengan:list.set(index, updater(list.get(index, notSetValue)))
".Bukan itu cara kerja daftar. Anda harus mengetahui indeks elemen yang ingin Anda perbarui, atau Anda harus mencarinya.
Ini harus dilakukan:
sumber
Map
lebih dari satuList
adalah pendekatan yang Anda sarankan? Atau apakah Anda hanya mengatakan itu karena OP mengatakan "pilih item dengan nama" dan bukan "pilih item dengan id"?Gunakan .map ()
sumber
Saya sangat menyukai pendekatan ini dari situs web thomastuts :
sumber
Anda bisa menggunakan
map
:Tapi ini akan mengulangi seluruh koleksi.
sumber