javascript - 如何在 immutable.js 中将 map 列表转换为 map map ?

标签 javascript immutable.js

假设我有一个像这样的 immutable.js List:

var xs = Immutable.fromJS([{key: "k", text: "foo"}])

我想将其转换为如下所示的 map :

var ys = Immutable.fromJS({k: {key: "k", text: "foo"}})

如何在 immutable.js 中将 xs 转换为 ys

按惯用方式,我的意思是任何中间结构都应该是 immutable.js 结构,并且我认为任何中间步骤都将使用 iterable composition而不是创建全尺寸的中间表示。

编辑:我创建了一个 jsperf benchmark比较迄今为止提供的答案。这两种非变异解决方案对我来说都相当惯用;我可能会坚持下去,让投票决定所选择的答案,或者坚持下去,直到我们可以收集一组大致相同的惯用技术。

最佳答案

您可以将输入列表减少到新的 Immutable.Map 中:

var ys = xs.reduce(
      function(result, item) { return result.set(item.get('key'), item); }, 
      Immutable.Map());

在这种情况下没有中间表示,但不可变映射必须在每次迭代中更新(事实上,必须创建新实例),这可能不是最优的(取决于 Immutable.Map 的实际实现) .

您可以优化它,将其简化为常规 JavaScript 对象,最后将其转换为不可变映射:

var ys = Immutable.Map(xs.reduce(
      function(result, item) { result[item.get('key')] = item; return result; }, 
      {}));

但这肯定不太惯用。

关于javascript - 如何在 immutable.js 中将 map 列表转换为 map map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29573728/

相关文章:

javascript - 来自变量的 jQuery UI 对话框按钮

javascript - Immutable.js 中的 "ownerID"是什么?

immutable.js - 我什么时候应该在 Immutable.js 的 map 上使用 `withMutations`?

带有 jQ​​uery 的 JavaScript 语法

javascript - jQuery fadeIn() 间隔多个 div

javascript - 是否可以在网络套接字中建立房间的概念?

arrays - 如何循环像forEach这样的不可变列表?

javascript - React Immutable JS 如何订购 map

reactjs - 不可变-JS : Merge a List of Maps by key

javascript - react native - 在渲染()之前从存储中获取状态