Esto es lo que dijeron los documentos oficiales
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>
¡No hay forma de que un desarrollador web normal (no un programador funcional) lo entienda!
Tengo un caso bastante simple (para un enfoque no funcional).
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);
¿Cómo puedo actualizar listdonde el elemento con nombre tercero tiene su recuento establecido en 4 ?
javascript
functional-programming
immutable.js
Vitalii Korsakov
fuente
fuente

Respuestas:
El caso más apropiado es usar ambos
findIndexyupdatemétodos.PD: No siempre es posible usar Maps. Por ejemplo, si los nombres no son únicos y quiero actualizar todos los elementos con los mismos nombres.
fuente
Con .setIn () puedes hacer lo mismo:
Si no conocemos el índice de la entrada que queremos actualizar. Es bastante fácil encontrarlo usando .findIndex () :
¡Espero eso ayude!
fuente
{ }dentrofromJS( ), sin las llaves no es válido JS.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 = 4sintaxis 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.
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 valor4en el índice2.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
sethaysetIn. 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 delsetInmétodo funciona igualset, es el nuevo valor que queremos poner allí, así que: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:
NB:
SetvsUpdateLa 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 deset(). Mientras que el segundo argumentoset()es el nuevo valor que queremos, el segundo argumentoupdate()es una función que acepta el valor anterior y devuelve el nuevo valor que queremos. Entonces,updateIn()es la variación "In" de laupdate()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:fuente
No es necesario
updateIn, que es solo para estructuras anidadas. Está buscando elupdatemétodo , que tiene una firma y documentación mucho más simple:que, como sugieren los
Map::updatedocumentos , es " equivalente a:list.set(index, updater(list.get(index, notSetValue)))".Así no es como funcionan las listas. Debe conocer el índice del elemento que desea actualizar o debe buscarlo.
Esto debería hacerlo:
fuente
MapsobreListes el enfoque que sugeriría. ¿O solo dice eso porque OP dijo "seleccionar elemento por nombre" y no "seleccionar elemento por id"?Use .map ()
fuente
Realmente me gusta este enfoque del sitio web de thomastuts :
fuente
Puedes usar
map:Pero esto se repetirá en toda la colección.
fuente