在Immutable.js中获取嵌套值

xia*_*kai 29 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);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

use*_*308 55

地图只是具有值的键的集合.你拥有的是一张带有钥匙categories和价值的地图{1: 'a', 2: 'b'}.该值不会自动成为Immutable地图,因为您将其放在另一个地图中.

现在,该getIn()函数只会"看到"其他Immutable.js地图.你在那里有一个常规的ol'javascript对象.如果您只想获得1价值,您可以这样做:

var obj = Immutable.Map({categories: {1: 'a', 2: 'b'}});
var output = obj.getIn(["categories"])[1];
alert(output);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

如果您希望categories集合也是地图,则必须明确定义.另外,正如Amit所指出的,你需要使用带有该getIn()功能的字符串.

var obj = Immutable.Map({
	categories: Immutable.Map({
		1: 'a',
		2: 'b'
	})
});
var output = obj.getIn(['categories', '1']);
alert(output);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

上面的代码将返回'a'.

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

var obj = Immutable.fromJS({
	categories: {
		1: 'a',
		2: 'b'
	}
});
var output = obj.getIn(['categories', '1']);
alert(output);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

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


Ami*_*mit 18

您的代码有2个问题:

  1. Immutable.Map(...)不遍历参数以创建复杂的不可变.为此你需要Immutable.fromJS(...).
  2. 一旦你这样做,你需要使用字符串getIn(...),所以['categories', '1']而不是['categories', 1].

工作小提琴.