2015-02-06 92 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

相關問題