var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
Explication
La mise à jour des collections Immutable.js renvoie toujours les nouvelles versions de ces collections en laissant l'original inchangé. Pour cette raison, nous ne pouvons pas utiliser la list[2].count = 4
syntaxe de mutation de JavaScript . Au lieu de cela, nous devons appeler des méthodes, comme nous pourrions le faire avec les classes de collection Java.
Commençons par un exemple plus simple: juste les décomptes dans une liste.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
Maintenant , si nous voulions mettre à jour le 3ème article, un tableau JS plaine pourrait ressembler à : counts[2] = 4
. Puisque nous ne pouvons pas utiliser de mutation et que nous devons appeler une méthode, nous pouvons utiliser à la place: counts.set(2, 4)
- cela signifie définir la valeur 4
à l'index 2
.
Mises à jour profondes
L'exemple que vous avez donné a cependant des données imbriquées. Nous ne pouvons pas simplement utiliser set()
sur la collection initiale.
Les collections Immutable.js ont une famille de méthodes dont les noms se terminent par "In" qui vous permettent d'apporter des modifications plus profondes dans un ensemble imbriqué. Les méthodes de mise à jour les plus courantes ont une méthode "In" associée. Par exemple car set
il y en a setIn
. Au lieu d'accepter un index ou une clé comme premier argument, ces méthodes "In" acceptent un "chemin de clé". Le chemin de clé est un tableau d'index ou de clés qui illustre comment accéder à la valeur que vous souhaitez mettre à jour.
Dans votre exemple, vous vouliez mettre à jour l'élément dans la liste à l'index 2, puis la valeur à la clé «count» dans cet élément. Le chemin clé serait donc [2, "count"]
. Le deuxième paramètre de la setIn
méthode fonctionne exactement comme set
, c'est la nouvelle valeur que nous voulons y mettre, donc:
list = list.setIn([2, "count"], 4)
Trouver le bon chemin clé
Pour aller plus loin, vous avez en fait dit que vous vouliez mettre à jour l'élément dont le nom est "trois", ce qui est différent du troisième élément. Par exemple, peut-être que votre liste n'est pas triée, ou peut-être que l'élément nommé «deux» a été supprimé plus tôt? Cela signifie d'abord que nous devons nous assurer que nous connaissons réellement le chemin de clé correct! Pour cela, nous pouvons utiliser la findIndex()
méthode (qui, d'ailleurs, fonctionne presque exactement comme Array # findIndex ).
Une fois que nous avons trouvé l'index dans la liste qui contient l'élément que nous voulons mettre à jour, nous pouvons fournir le chemin d'accès de la clé à la valeur que nous souhaitons mettre à jour:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB: Set
vsUpdate
La question d'origine mentionne les méthodes de mise à jour plutôt que les méthodes définies. Je vais expliquer le deuxième argument de cette fonction (appelée updater
), car il est différent de set()
. Alors que le deuxième argument de set()
est la nouvelle valeur que nous voulons, le deuxième argument de update()
est une fonction qui accepte la valeur précédente et renvoie la nouvelle valeur que nous voulons. Ensuite, updateIn()
est la variante "In" de update()
qui accepte un chemin clé.
Supposons, par exemple, que nous voulions une variante de votre exemple qui ne se contente pas de définir le nombre 4
, mais qui incrémente à la place le nombre existant, nous pourrions fournir une fonction qui en ajoute une à la valeur existante:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)