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
调用一样好或更好。
答案 0 :(得分:2)
您最好使用为此设计的功能,而不是forEach
和push
。
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鼓励的函数式编程模型的好处。