Frage Geschachtelte Werte in Immutable.js abrufen


Nach den Unterlagen hier: https://facebook.github.io/immutable-js/docs/#/Map/getIn

Ich sollte in der Lage sein, den tief verschachtelten Wert zu erhalten, indem ich ein Array für die keyPath Streit. Das habe ich gemacht, aber ich bekomme es undefined als Rückgabewert.

http://jsfiddle.net/srxv4mwu/

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

Was mache ich falsch?


26
2017-11-25 07:00


Ursprung


Antworten:


Eine Map ist einfach eine Sammlung von Schlüsseln mit Werten. Was Sie haben, ist eine Karte mit dem Schlüssel categoriesund der Wert {1: 'a', 2: 'b'}. Der Wert wird nicht automatisch zu einer unveränderlichen Karte, nur weil Sie ihn in eine andere Karte einfügen.

Jetzt die getIn() Funktion wird nur andere Immutable.js Karten "sehen". Was Sie dort haben, ist ein normales Javascript-Objekt. Wenn du nur das bekommen willst 1 Wert, können Sie einfach tun:

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>

Wenn du willst categories Sammlung, um auch eine Karte zu sein, müssen Sie das explizit definieren. Wie Amit bereits sagte, müssen Sie Strings mit dem verwenden getIn() Funktion.

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>

Der obige Code wird zurückgegeben 'a'.

Es wäre wahrscheinlich bequemer für Sie, etwas wie unten zu tun, wenn Sie viele verschachtelte Karten haben.

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>

Das fromJs() Die Funktion konvertiert alle verschachtelten Objekte automatisch in Karten oder Listen.


50
2017-11-25 07:14



Es gibt 2 Probleme mit deinem Code:

  1. Immutable.Map(...) Durchläuft den Parameter nicht, um einen komplexen unveränderlichen Code zu erstellen. Dafür brauchst du Immutable.fromJS(...).
  2. Sobald Sie das tun, müssen Sie Zeichenfolgen in verwenden getIn(...), damit ['categories', '1'] Anstatt von ['categories', 1].

Sehen arbeitende Geige.


16
2017-11-25 07:17