2015-02-06 85 views
2

我误解了它的目的或它的工作原理吗?为什么使用withMutations会得到不同的结果?

var menuItems = Immutable.List.of(
    { parent_id: 0, id: 1 }, 
    { parent_id: 1, id: 2 }, 
    { parent_id: 1, id: 3 } 
); 

var results1 = menuItems 
    .filter(function(menuItem) { return menuItem.parent_id === 1; }) // Filter out items with parent_id = 1 
    .sort(function(childA, childB) { return childA.sort_order - childB.sort_order; }); // Sort them by sort_order 

var results2 = menuItems.withMutations(function(list) { 
    list 
    .filter(function(menuItem) { return menuItem.parent_id === 1; }) // Filter out items with parent_id = 1 
    .sort(function(childA, childB) { return childA.sort_order - childB.sort_order; }); // Sort them by sort_order 
}); 

console.log(results1.size); // 2 
console.log(results2.size); // 3 

我的理解是,他们会产生相同的结果,但withMutations会更快,因为操作的链接。

回答

4

您误会了withMutations。重点在于给你一个临时的游乐场,你可以在这里实际改变列表而不是创建副本。

一个例子是:

var results2 = menuItems.withMutations(function(list) { 
    list.shift() 
}); 

在代码中,您使用filterwithMutations。过滤器创建一个新的数组,并且不会修改原始数组,因此您的withMutations什么都不做。

我想你会更好,因为根本不使用withMutations。如果在某个时候您认为“如果我可以修改阵列而不是复制副本,这会更容易”,您可以转到withMutations

+0

奖励:https://github.com/facebook/immutable-js/issues/196#issuecomment-74131152 在未来的版本中,当你尝试做我做的事情时,Immutable会抛出一个错误 – oskarth 2015-02-12 19:31:12

相关问题