Selon les documents ici: https://facebook.github.io/immutable-js/docs/#/Map/getIn
Je devrais pouvoir obtenir la valeur profondément imbriquée en fournissant un tableau pour l'argument keyPath
. C'est ce que j'ai fait, mais j'obtiens undefined
comme valeur de retour.
var obj = Immutable.Map({categories: {1: 'a', 2: 'b'}});
var output = obj.getIn(['categories', 1]);
alert(output);
Qu'est-ce que je fais mal?
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 immuable simplement parce que vous la placez dans une autre carte.
Désormais, la fonction getIn()
ne "verra" que les autres cartes Immutable.js. Ce que vous avez là-dedans est un objet javascript normal. Si vous voulez simplement obtenir la valeur 1
, Vous pouvez simplement 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 souhaitez que la collection categories
soit également une carte, vous devrez la définir explicitement. En outre, comme l'a souligné Amit, vous devrez utiliser des chaînes avec la fonction 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>
Le code ci-dessus renverra 'a'
.
Il serait probablement plus pratique pour vous de faire quelque chose comme ci-dessous, si vous avez de nombreuses cartes imbriquées.
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 fonction fromJs()
convertira automatiquement tous les objets imbriqués en cartes ou listes.
Il y a 2 problèmes avec votre code:
Immutable.Map(...)
ne traverse pas le paramètre pour créer un complexe immuable. Pour cela, vous avez besoin de Immutable.fromJS(...)
.getIn(...)
, donc ['categories', '1']
au lieu de ['categories', 1]
.Voir violon de travail .