javascript - Immutable.js:如何使用 withMutations 同时构建两个数据结构

标签 javascript immutable.js

Immutable.js 有一个很好的功能 withMutations ,它允许您使用临时可变对象构建复杂的不可变对象(immutable对象),从而不必在构建过程中创建新引用。

这对于转换如下内容非常有用:

// Bad way
var goodThing = badThing.set("something", 123);
goodThing = goodThing.set("somethingElse", 456);
goodThing = goodThing.set("anotherThing", 789);
...

// Good way
var goodThing = badThing.withMutations(function(bt) {
  bt.set("something", 123);
  bt.set("somethingElse", 456);
  bt.set("anotherThing", 789);
  ...
});

但是如果我想同时创建两个对象怎么办?

// What I have now
var list1 = List();
var list2 = List();

someStuff.forEach(function(value, key) {
  list1 = list1.push(value.id);
  list2 = list2.push(key);
}); 

// The best I've come up with...
var list1 = List();
var list2 = List();

list1 = list1.withMutations(function(l1) {
  list2 = list2.withMutations(function(l2) {
    someStuff.forEach(function(value, key) {
      l1.push(value.id);
      l2.push(key);
    }); 
  });
});

到目前为止,我想到的最好的办法是包装 withMutations 调用,但这隐藏了正在发生的事情的含义,而且看起来很糟糕且令人困惑。有没有办法将多个对象传递到 withMutations 调用中?如果不是,那么实现此目的的最佳方法是什么(除非是这样......)?

编辑:要成为“更好”的解决方案,它的性能也必须与嵌套的 withMutations 调用一样好或更好。

最佳答案

您最好使用为此设计的函数,而不是 forEachpush

var list1 = Immutable.List();
var list2 = Immutable.List();

var names = list.map(function(item) { return item.get("name") })
var ages = list.map(function(item) { return item.get("age") })

list1 = list1.concat(names)
list2 = list2.concat(ages)

在您的性能测试中,这比任何其他选项都要快。它还具有更接近 Immutable.js 所鼓励的函数式编程模型的好处。

http://jsfiddle.net/ecremq35/

关于javascript - Immutable.js:如何使用 withMutations 同时构建两个数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30114871/

相关文章:

javascript - IP 地址中的国家/地区名称

javascript - 将html文本适当 chop 到固定大小的区域

javascript - 如何使用php获取链接标签的标题

javascript - 不可变js的递归分组

javascript - 我应该对仅具有函数的对象使用不变性吗?

javascript - 组合 Javascript block

javascript - 如何使用 Javascript 在 HTML 表格中查找第一个空行

javascript - 在react-redux实现中mapStateToProps如何接收更新后的状态

javascript - Immutable JS 从 map 中的所有元素中删除属性

javascript - Immutable.js mergeDeepWith 问题