2015-11-25 70 views
25

嵌套值根據這裏的文檔:https://facebook.github.io/immutable-js/docs/#/Map/getIn獲得在Immutable.js

我應該能夠通過爲keyPath參數數組來獲得深度嵌套值。這是我所做的,但是我得到undefined作爲返回值。

http://jsfiddle.net/srxv4mwu/

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

我在做什麼錯?

+0

感謝您提出這個問題,爲什麼文檔似乎消失了'getIn'?該方法是否被棄用? –

+0

對不起,顯然它是繼承的:https://facebook.github.io/immutable-js/docs/#/Iterable/getIn –

回答

48

地圖只是具有值的鍵的集合。你所擁有的是一張地圖,鑰匙categories,值{1: 'a', 2: 'b'}。該值不會因爲您將其放置在另一個地圖中而自動變爲不可變的地圖。

現在,getIn()函數將只會「看到」其他Immutable.js映射。你在那裏有一個普通的ol'javascript對象。如果你只是想獲得1值,你可以做:

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>

如果你想categories集合也可以是地圖,你必須定義明確。另外,正如Amit指出的那樣,您需要使用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>

上面的代碼將返回'a'

如果你有很多嵌套的地圖,你可能會更方便地做下面的事情。

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>

fromJs()功能會自動地將嵌套對象轉換爲地圖或列出了你。

+0

關閉,但不起作用:-)。看到我的答案。 – Amit

+0

現在片段工作。 Immutable庫之前未鏈接。 – cars10m

+0

「現在,getIn()函數將僅」查看「其他Immutable.js映射。你在那裏有一個普通的ol'JavaScript對象....「 我發佈了一個相關的問題在https://stackoverflow.com/questions/49025635/deep-access-in-plain-objects-with -immutable 在那裏引用的文檔似乎表明,getIn也支持普通對象? – davidkomer

15

有2個問題,你的代碼:

  1. Immutable.Map(...)不遍歷參數創建一個複雜的不可變的。爲此,你需要Immutable.fromJS(...)
  2. 一旦你這樣做了,你需要在getIn(...)中使用字符串,所以['categories', '1']而不是['categories', 1]

請參閱working fiddle

+1

這看起來像是一個正確的答案。 – dmi3y