javascript immutable.js

javascript - Obtener valores anidados en Immutable.js



(2)

De acuerdo con los documentos aquí: https://facebook.github.io/immutable-js/docs/#/Map/getIn

Debería poder obtener el valor profundamente anidado proporcionando una matriz para el argumento keyPath . Esto es lo que he hecho, sin embargo, me estoy volviendo undefined como valor de retorno.

http://jsfiddle.net/srxv4mwu/

var obj = Immutable.Map({categories: {1: ''a'', 2: ''b''}}); var output = obj.getIn([''categories'', 1]); alert(output);

¿Qué estoy haciendo mal?


Hay 2 problemas con su código:

  1. Immutable.Map(...) no atraviesa el parámetro para crear un complejo inmutable. Para eso necesitas Immutable.fromJS(...) .
  2. Una vez que lo haga, deberá usar cadenas en getIn(...) , así que [''categories'', ''1''] lugar de [''categories'', 1] .

Ver trabajo violín .


Un mapa es simplemente una colección de claves con valores. Lo que tienes es un mapa con las categories clave y el valor {1: ''a'', 2: ''b''} . El valor no se convierte automáticamente en un mapa inmutable simplemente porque lo coloca dentro de otro mapa.

Ahora, la función getIn() solo "verá" otros mapas Immutable.js. Lo que tienes allí es un objeto normal de javascript. Si solo desea obtener el valor 1 , puede hacer:

var obj = Immutable.Map({categories: {1: ''a'', 2: ''b''}}); var output = obj.getIn(["categories"])[1]; alert(output);

<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>

Si desea que la colección de categories también sea un mapa, tendrá que definirlo explícitamente. Además, como lo señaló Amit, deberá usar cadenas con la función getIn() .

var obj = Immutable.Map({ categories: Immutable.Map({ 1: ''a'', 2: ''b'' }) }); var output = obj.getIn([''categories'', ''1'']); alert(output);

<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>

El código anterior devolverá ''a'' .

Probablemente sería más conveniente para usted hacer algo como a continuación, si tiene muchos mapas anidados.

var obj = Immutable.fromJS({ categories: { 1: ''a'', 2: ''b'' } }); var output = obj.getIn([''categories'', ''1'']); alert(output);

<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>

La función fromJs() convertirá cualquier objeto anidado en mapas o listas automáticamente para usted.