2015-11-25 5 views
25

Selon les docs ici: https://facebook.github.io/immutable-js/docs/#/Map/getInObtenir des valeurs imbriquées dans Immutable.js

je devrais être en mesure d'obtenir la valeur profondément imbriquée en fournissant un tableau pour l'argument keyPath. C'est ce que j'ai fait, mais je reçois undefined comme valeur de retour.

http://jsfiddle.net/srxv4mwu/

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

Qu'est-ce que je fais mal?

+0

Merci pour cette question, pourquoi les docs ont apparemment disparu pour 'getIn'? La méthode a-t-elle été dépréciée? –

+0

Désolé, apparemment c'est hérité: https://facebook.github.io/immutable-js/docs/#/Iterable/getIn –

Répondre

48

Une carte est simplement une collection de clés avec des valeurs. Ce que vous avez est une carte avec la clé categories, et la valeur {1: 'a', 2: 'b'}. La valeur ne devient pas automatiquement une carte Immutable simplement parce que vous la placez dans une autre carte. Maintenant, la fonction getIn() va "voir" d'autres cartes Immutable.js. Ce que vous avez dedans est un objet ol 'javascript régulier. Si vous voulez juste pour obtenir la valeur 1, vous pouvez juste faire:

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 vous voulez que la collection categories être aussi une carte, vous devrez définir explicitement. En outre, comme Amit l'a souligné, vous devrez utiliser des chaînes avec la fonction 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>

Le code ci-dessus retournera 'a'.

Il serait probablement plus pratique pour vous de faire quelque chose comme ci-dessous, si vous avez beaucoup de cartes imbriquées.

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 fonction fromJs() convertit tous les objets imbriqués dans des cartes ou des listes automatiquement pour vous.

+0

Fermer, mais ne fonctionne pas :-). Vois ma réponse. – Amit

+0

Maintenant, les extraits fonctionnent. Les bibliothèques immuables n'étaient pas liées auparavant. – cars10m

+0

"Maintenant, la fonction getIn() ne" verra "que les autres cartes Immutable.js.Qu'est-ce que vous avez là-bas est un objet ol 'javascript régulier .... " J'ai posté une question à ce sujet à https://stackoverflow.com/questions/49025635/deep-access-in-plain-objects-with -immutable La documentation citée ici semble indiquer que les objets simples sont également supportés avec getIn? – davidkomer

15

Il y a 2 problèmes avec votre code:

  1. Immutable.Map(...) ne traverse pas le paramètre pour créer un complexe immuable. Pour cela, vous avez besoin de Immutable.fromJS(...).
  2. Une fois que vous faites cela, vous devez utiliser des chaînes dans getIn(...), donc ['categories', '1'] au lieu de ['categories', 1].

Voir working fiddle.

+1

Cela ressemble à une bonne réponse. – dmi3y