var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
Spiegazione
L'aggiornamento delle raccolte Immutable.js restituisce sempre nuove versioni di tali raccolte lasciando invariato l'originale. Per questo motivo, non possiamo usare la list[2].count = 4
sintassi di mutazione di JavaScript . Invece dobbiamo chiamare metodi, proprio come potremmo fare con le classi di raccolta Java.
Cominciamo con un esempio più semplice: solo i conteggi in un elenco.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
Ora, se volessimo aggiornare il terzo elemento, un array di JS pianura potrebbe essere simile: counts[2] = 4
. Dato che non possiamo usare la mutazione e dobbiamo chiamare un metodo, invece possiamo usare: counts.set(2, 4)
- ciò significa impostare il valore 4
sull'indice 2
.
Aggiornamenti approfonditi
L'esempio che hai fornito ha comunque dei dati nidificati. Non possiamo limitarci a utilizzare set()
la raccolta iniziale.
Le raccolte Immutable.js hanno una famiglia di metodi con nomi che terminano con "In" che consentono di apportare modifiche più profonde in un set nidificato. I metodi di aggiornamento più comuni hanno un metodo "In" correlato. Ad esempio perché set
c'èsetIn
. Invece di accettare un indice o una chiave come primo argomento, questi metodi "In" accettano un "percorso chiave". Il percorso della chiave è una matrice di indici o chiavi che illustra come arrivare al valore che si desidera aggiornare.
Nel tuo esempio, volevi aggiornare l'elemento nell'elenco all'indice 2, quindi il valore nella chiave "conta" all'interno di quell'elemento. Quindi il percorso chiave sarebbe [2, "count"]
. Il secondo parametro del setIn
metodo funziona esattamente come set
, è il nuovo valore che vogliamo mettere lì, quindi:
list = list.setIn([2, "count"], 4)
Trovare il giusto percorso chiave
Andando oltre, hai effettivamente detto di voler aggiornare l'elemento in cui il nome è "tre", che è diverso dal solo 3 ° elemento. Ad esempio, forse il tuo elenco non è ordinato o forse lì l'elemento chiamato "due" è stato rimosso in precedenza? Ciò significa che prima dobbiamo assicurarci di conoscere effettivamente il percorso chiave corretto! Per questo possiamo usare il findIndex()
metodo (che, a proposito, funziona quasi esattamente come Array # findIndex ).
Una volta trovato l'indice nell'elenco che contiene l'elemento che vogliamo aggiornare, possiamo fornire il percorso chiave al valore che vogliamo aggiornare:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB: Set
vsUpdate
La domanda originale menziona i metodi di aggiornamento piuttosto che i metodi impostati. Spiegherò il secondo argomento in quella funzione (chiamata updater
), poiché è diverso da set()
. Mentre il secondo argomento set()
è il nuovo valore che vogliamo, il secondo argomento update()
è una funzione che accetta il valore precedente e restituisce il nuovo valore desiderato. Quindi, updateIn()
è la variazione "In" diupdate()
cui accetta un percorso chiave.
Supponiamo, ad esempio, che volessimo una variante del tuo esempio che non solo imposti il conteggio su 4
, ma aumentasse invece il conteggio esistente, potremmo fornire una funzione che ne aggiunga uno al valore esistente:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)