2015-11-25 13 views
25

Nach dem docs hier: https://facebook.github.io/immutable-js/docs/#/Map/getInErste verschachtelte Werte in Immutable.js

Ich soll einen Array, indem sie für das keyPath Argument den tief verschachtelten Wert erhalten kann. Dies ist, was ich getan habe, aber ich bekomme 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?

+0

Vielen Dank für diese Frage, warum scheinen die Dokumente für 'getIn' verschwunden zu sein? Ist die Methode veraltet? –

+0

Sorry, anscheinend ist es geerbt: https://facebook.github.io/immutable-js/docs/#/Iterable/getIn –

Antwort

48

Eine Karte ist einfach eine Sammlung von Schlüsseln mit Werten. Was Sie haben, ist eine Karte mit dem Schlüssel categories, und 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 wird die getIn() Funktion nur andere Immutable.js Karten "sehen". Was Sie dort haben, ist ein normales Javascript-Objekt. Wenn Sie nur den 1 Wert erhalten möchten, 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 Sie die categories Sammlung wollen auch eine Karte sein, Sie werden feststellen, dass explizit definieren. Wie Amit bemerkte, müssen Sie auch Strings mit der getIn() Funktion verwenden.

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>

Der obige Code wird 'a' zurück.

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

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>

Die fromJs() Funktion werden alle verschachtelten Objekten in Karten oder Listen automatisch für Sie konvertieren.

+0

Schließen, aber funktioniert nicht :-). Siehe meine Antwort. – Amit

+0

Jetzt funktionieren die Schnipsel. Die unveränderlichen Bibliotheken wurden vorher nicht verknüpft. – cars10m

+0

"Jetzt wird die Funktion getIn() nur andere Immutable.js-Maps" sehen ".Was Sie dort haben, ist ein normales ol 'Javascript-Objekt .... " Ich habe eine entsprechende Frage bei https://stackoverflow.com/questions/49025635/deep-access-in-plain-objects-with veröffentlicht -immutable Die dort zitierte Dokumentation scheint anzuzeigen, dass auch einfache Objekte mit getIn unterstützt werden? – davidkomer

15

Es gibt zwei Probleme mit Ihrem Code:

  1. Immutable.Map(...) nicht durchqueren die Parameter nicht einen Komplex unveränderlich zu erstellen. Dafür benötigen Sie Immutable.fromJS(...).
  2. Sobald Sie das tun, müssen Sie Zeichenfolgen in getIn(...), also ['categories', '1'] statt ['categories', 1] verwenden.

Siehe working fiddle.

+1

Das sieht nach einer richtigen Antwort aus. – dmi3y

Verwandte Themen