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 list
donde 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
findIndex
yupdate
mé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 = 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.
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 valor4
en 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
set
haysetIn
. 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 delsetIn
mé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:
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 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 elupdate
método , que tiene una firma y documentación mucho más simple:que, como sugieren los
Map::update
documentos , 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
Map
sobreList
es 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