在Immutable.js中获取嵌套值

时间:2015-11-25 07:00:07

标签: javascript immutable.js

根据此处的文档:https://facebook.github.io/immutable-js/docs/#/Map/getIn

我应该能够通过为keyPath参数提供一个数组来获得深度嵌套的值。这就是我所做的,但是我将undefined作为返回值。

http://jsfiddle.net/srxv4mwu/

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

我做错了什么?

2 个答案:

答案 0 :(得分:53)

地图只是具有值的键的集合。您拥有的是包含密钥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({
	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>

以上代码将返回'a'

如果您有许多嵌套地图,那么您可能会更方便地执行以下操作。

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>

fromJs()函数会自动将任何嵌套对象转换为地图或列表。

答案 1 :(得分:17)

您的代码有两个问题:

  1. Immutable.Map(...)不会遍历参数以创建复杂的不可变参数。为此,您需要Immutable.fromJS(...)
  2. 执行此操作后,您需要在getIn(...)中使用字符串,因此['categories', '1']代替['categories', 1]
  3. 请参阅working fiddle