获取 Immutable.js 中的嵌套值

Getting nested values in Immutable.js

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

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

http://jsfiddle.net/srxv4mwu/

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

我做错了什么?

映射只是具有值的键的集合。您拥有的是一个带有键 categories 和值 {1: 'a', 2: 'b'} 的映射。该值不会因为您将它放在另一个映射中而自动成为不可变映射。

现在,getIn() 函数只会 "see" 其他 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>

以上代码将return'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() 函数会自动为您将任何嵌套对象转换为地图或列表。

您的代码有 2 个问题:

  1. Immutable.Map(...) 不遍历参数来创建复杂的不可变。为此你需要 Immutable.fromJS(...).
  2. 完成后,您需要在 getIn(...) 中使用字符串,因此 ['categories', '1'] 而不是 ['categories', 1]

working fiddle