var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
Explicación
La actualización de las colecciones Immutable.js siempre devuelve nuevas versiones de esas colecciones dejando el original sin cambios. Por eso, no podemos usar la list[2].count = 4
sintaxis de mutación de JavaScript . En su lugar, necesitamos llamar a métodos, como lo haríamos con las clases de colección de Java.
Comencemos con un ejemplo más simple: solo los recuentos en una lista.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
Ahora bien, si queremos actualizar la tercera tema, una matriz de JS sencillo puede ser: counts[2] = 4
. Como no podemos usar la mutación y necesitamos llamar a un método, podemos usar: counts.set(2, 4)
eso significa establecer el valor 4
en el índice 2
.
Actualizaciones profundas
Sin embargo, el ejemplo que dio tiene datos anidados. No podemos simplemente usar set()
en la colección inicial.
Las colecciones Immutable.js tienen una familia de métodos con nombres que terminan en "In" que le permiten realizar cambios más profundos en un conjunto anidado. Los métodos de actualización más comunes tienen un método "In" relacionado. Por ejemplo para set
hay setIn
. En lugar de aceptar un índice o una clave como primer argumento, estos métodos "En" aceptan una "ruta de clave". La ruta de la clave es una matriz de índices o claves que ilustra cómo llegar al valor que desea actualizar.
En su ejemplo, deseaba actualizar el elemento en la lista en el índice 2, y luego el valor en la clave "contar" dentro de ese elemento. Entonces el camino clave sería [2, "count"]
. El segundo parámetro del setIn
método funciona igual set
, es el nuevo valor que queremos poner allí, así que:
list = list.setIn([2, "count"], 4)
Encontrar el camino clave correcto
Yendo un paso más allá, en realidad dijiste que querías actualizar el elemento donde el nombre es "tres", que es diferente al solo tercer elemento. Por ejemplo, ¿tal vez su lista no está ordenada, o tal vez allí el elemento llamado "dos" fue eliminado anteriormente? ¡Eso significa que primero debemos asegurarnos de que realmente conocemos la ruta de clave correcta! Para esto podemos usar el findIndex()
método (que, por cierto, funciona casi exactamente como Array # findIndex ).
Una vez que hayamos encontrado el índice en la lista que contiene el elemento que queremos actualizar, podemos proporcionar la ruta clave al valor que deseamos actualizar:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB: Set
vsUpdate
La pregunta original menciona los métodos de actualización en lugar de los métodos establecidos. Explicaré el segundo argumento en esa función (llamada updater
), ya que es diferente de set()
. Mientras que el segundo argumento set()
es el nuevo valor que queremos, el segundo argumento update()
es una función que acepta el valor anterior y devuelve el nuevo valor que queremos. Entonces, updateIn()
es la variación "In" de la update()
cual acepta una ruta clave.
Digamos, por ejemplo, que queremos una variación de su ejemplo que no solo establezca el recuento 4
, sino que incremente el recuento existente, podríamos proporcionar una función que agregue uno al valor existente:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)