假设我有一个像这样的 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/