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
调用一样好或更好。
最佳答案
您最好使用为此设计的函数,而不是 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 所鼓励的函数式编程模型的好处。
关于javascript - Immutable.js:如何使用 withMutations 同时构建两个数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30114871/