Javascript 在 Immutable.js 中获取嵌套值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33910300/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 15:38:25  来源:igfitidea点击:

Getting nested values in Immutable.js

javascriptimmutable.js

提问by xiankai

According to the docs here: https://facebook.github.io/immutable-js/docs/#/Map/getIn

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

I should be able to get the deeply nested value by providing an array for the keyPathargument. This is what I've done, however I'm getting undefinedas the return value.

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

http://jsfiddle.net/srxv4mwu/

http://jsfiddle.net/srxv4mwu/

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

What am I doing wrong?

我究竟做错了什么?

回答by user1440308

A map is simply a collection of keys with values. What you have is a map with the key categories, and the value {1: 'a', 2: 'b'}. The value does not automatically become an Immutable map just because you place it inside another map.

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

Now, the getIn()function will only "see" other Immutable.js maps. What you have in there is a regular ol' javascript object. If you just want to get the 1value, you can just do:

现在,该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>

If you want the categoriescollection to also be a map, you'll have to define that explicitly. Also, as Amit pointed out, you'll need to use strings with the getIn()function.

如果您希望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>

The above code will return 'a'.

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

It would probably be more convenient for you to do something like below, if you have many nested maps.

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

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>

The fromJs()function will convert any nested objects into maps or lists automatically for you.

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

回答by Amit

There are 2 problems with your code:

您的代码有两个问题:

  1. Immutable.Map(...)doesn't traverse the parameter to create a complex immutable. For that you need Immutable.fromJS(...).
  2. Once you do that, you need to use strings in getIn(...), so ['categories', '1']instead of ['categories', 1].
  1. Immutable.Map(...)不遍历参数来创建一个复杂的不可变。为此,您需要Immutable.fromJS(...).
  2. 一旦你这样做了,你需要在 中使用字符串getIn(...)['categories', '1']而不是['categories', 1].

See working fiddle.

请参阅工作小提琴