web-dev-qa-db-fra.com

Obtention de valeurs imbriquées dans Immutable.js

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.

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?

29
xiankai

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.

54
user1440308

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 avez fait cela, vous devez utiliser des chaînes dans getIn(...), donc ['categories', '1'] au lieu de ['categories', 1].

Voir violon de travail .

18
Amit