Immutable.js:如何使用withMutations一次构建两个数据结构

时间:2015-05-08 02:34:36

标签: javascript immutable.js

Immutable.js有一个很好的功能withMutations,它允许你使用临时可变对象构建一个复杂的不可变对象,以节省在构建过程中创建新引用的时间。

这非常适合转换这样的内容:

// 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调用一样好或更好。

1 个答案:

答案 0 :(得分:2)

您最好使用为此设计的功能,而不是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/