2015-11-25 16 views
25

Secondo la documentazione qui: https://facebook.github.io/immutable-js/docs/#/Map/getInCome valori nidificati Immutable.js

dovrei essere in grado di ottenere il valore di nidificazione, fornendo una matrice per l'argomento keyPath. Questo è quello che ho fatto, tuttavia sto ricevendo undefined come valore di ritorno.

http://jsfiddle.net/srxv4mwu/

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

Che cosa sto facendo di sbagliato?

+0

Grazie per questa domanda, perché i documenti sono apparentemente scomparsi per 'getIn'? Il metodo è stato deprecato? –

+0

Siamo spiacenti, apparentemente è ereditato: https://facebook.github.io/immutable-js/docs/#/Iterable/getIn –

risposta

48

Una mappa è semplicemente un insieme di chiavi con valori. Quello che hai è una mappa con la chiave categories e il valore {1: 'a', 2: 'b'}. Il valore non diventa automaticamente una mappa Immutabile solo perché lo inserisci in un'altra mappa.

Ora, la funzione getIn() vedrà solo "altre mappe Immutable.js. Quello che hai dentro è un normale oggetto javascript ol. Se si desidera solo per ottenere il valore 1, si può solo fare:

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>

Se si desidera che la raccolta categories di essere anche una mappa, si dovrà definire che in modo esplicito. Inoltre, come ha sottolineato Amit, dovrai utilizzare le stringhe con la funzione getIn().

var obj = Immutable.Map({ 
 
\t categories: Immutable.Map({ 
 
\t \t 1: 'a', 
 
\t \t 2: 'b' 
 
\t }) 
 
}); 
 
var output = obj.getIn(['categories', '1']); 
 
alert(output);
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>

Il codice di cui sopra tornerà 'a'.

Probabilmente sarebbe più conveniente per voi fare qualcosa come sotto, se avete molte mappe annidate.

var obj = Immutable.fromJS({ 
 
\t categories: { 
 
\t \t 1: 'a', 
 
\t \t 2: 'b' 
 
\t } 
 
}); 
 
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 funzione fromJs() convertirà oggetti nidificati in mappe o elenchi automaticamente per voi.

+0

Chiudi, ma non funziona :-). Vedi la mia risposta. – Amit

+0

Ora i frammenti funzionano. Le biblioteche immutabili non erano collegate prima. – cars10m

+0

"Ora, la funzione getIn() vedrà solo" altre mappe Immutable.js.Quello che hai dentro è un normale ol 'oggetto javascript .... " Ho postato una domanda relativa a questo https://stackoverflow.com/questions/49025635/deep-access-in-plain-objects-with -immutable La documentazione citata sembra indicare che gli oggetti semplici sono supportati anche con getIn? – davidkomer

15

Ci sono 2 problemi con il tuo codice:

  1. Immutable.Map(...) non attraversa il parametro per creare un complesso immutabile. Per questo è necessario Immutable.fromJS(...).
  2. Una volta fatto, è necessario utilizzare le stringhe in getIn(...), quindi ['categories', '1'] anziché ['categories', 1].

Vedere working fiddle.

+1

Sembra una risposta giusta. – dmi3y

Problemi correlati