Immutable.js 将值映射到数组
Posted
技术标签:
【中文标题】Immutable.js 将值映射到数组【英文标题】:Immutable.js Map values to array 【发布时间】:2016-01-13 22:14:27 【问题描述】:我正在使用来自http://facebook.github.io/immutable-js/docs/#/Map的不可变地图
我需要获取一组值以传递给后端服务,但我认为我缺少一些基本的东西,我该怎么做?
我试过了:
mymap.valueSeq().toArray()
但我仍然得到一个不可变的数据结构?
例如:
var d = '["address":"10.0.35.118","cpus":4]';
var sr = JSON.parse(d);
var is = Immutable.fromJS(sr);
console.log(sr);
console.log(is.toArray());
console.log(is.valueSeq().toArray());
看到这个http://jsfiddle.net/3sjq148f/2/
我们从不可变数据结构中得到的数组似乎仍然装饰着每个包含对象的不可变字段。这是意料之中的吗?
【问题讨论】:
你能提供更多细节吗?另外我觉得你可以试试toJS
。
jsfiddle,为我工作。你甚至不需要valueSeq
。你能创建一个样本来重现它吗?
试试这个:var array = [] mymap.valueSeq().forEach(function(item) array.push(item))
@fuyushimoya 你说得对 - 回到绘图板让我检查 - 谢谢
哎呀,错过了,但我相信它变成了Map
的Collection
。这意味着is.valueSeq().toArray()
为您提供Map
的数组。你需要进一步解包,比如this。
【参考方案1】:
Map.values()
返回一个 ES6 Iterable(Map.keys()
和 Map.entries()
也是如此),因此您可以使用 Array.from()
或 spread operator 转换为数组(如 this answer 中所述)。
例如:
Array.from(map.values())
或者只是
[...map.values()]
【讨论】:
你说的是 immutable.js Map 还是 ES6 Map? 不可变的.js。请参阅我的答案中的链接。这确实适用于 Immutable.js。 @mjuopperi 如果您发现其他情况,请澄清。【参考方案2】:因为sr
是Object
的Array
,所以如果你用.fromJS
来转换它,就变成Map
的List
。
is.valueSeq().toArray();
(这里不需要valueSeq
。)将其转换为Map
的Array
,因此您需要循环遍历数组,并将每个Map
项目转换为Array
。
var d = '["address":"10.0.35.118","cpus":4]';
var sr = JSON.parse(d);
// Array of Object => List of Map
var is = Immutable.fromJS(sr);
console.log(sr);
console.log(is.toArray());
// Now its Array of Map
var list = is.valueSeq().toArray();
console.log(list);
list.forEach(function(item)
// Convert Map to Array
console.log(item.toArray());
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.7.5/immutable.min.js"></script>
【讨论】:
map.valueSeq().toArray()
vs [...map.values()]
哪个更快?【参考方案3】:
只需使用someMap.toIndexedSeq().toArray()
来获取仅包含值的数组。
【讨论】:
以上是关于Immutable.js 将值映射到数组的主要内容,如果未能解决你的问题,请参考以下文章
immutable.js 更新数组(mergeDeepWith)