2016-11-25 56 views
1

內我有一個不變的地圖這樣不可變JS複製/複製列表地圖

Immutable.fromJS({ 
    sortingOnFields: false, 
    items: [], 
    selectedItems: [], 
    columnsConfigs: { 
     meta: {}, 
     columns: {} 
    }, 
}); 

我怎麼複製的項目清單selectedItems列表。

return state.set('selectedItems', state.get('items'));

不正確地做這項工作作爲以後如果我做

props.listing.get('selectedItems').includes(Immutable.fromJS(item)); 

其中Immutable.fromJS(item)是從「項目」列表中,則返回false。

我想這裏面工作,但看起來有點過分

return state.set('selectedItems', Immutable.fromJS(state.get('items').toJS())); 

一個更好的解決方案的任何想法?

+0

你爲什麼要以這種方式複製項目?當然,最好將你的物品作爲一個清單,然後存儲所選物品的索引或ID。 – VanDanic

回答

0

問題在於你的測試。你成功設置在兩個鍵相同的列表。您正在檢索items這是一個列表的值,並且您將該列表設置爲與selectedItems上的值完全相同的列表。

即使那工作,你的測試沒有完成它的工作。您寫道:

props.listing.get('selectedItems').includes(Immutable.fromJS(item)); 

這條線說:在selectedItems獲取列表。現在使用fromJS方法創建一個全新的不可變對象。 selectedItems中的列表是否包含新的不可變對象?答案是否定的,因爲你只是從頭開始創建該項目,所以它絕對不包含在列表中selectedItems

如果每個項目是一個原始值,你可以檢查這樣的:

props.listing.get('selectedItems').includes(item); 

如果每個項目是一個對象,那麼你將它轉換爲不可變對象?如果沒有,那麼你可以傳入一個對該項目的引用,如上所述。如果您確實將其轉換爲Immutable對象,請確保將引用傳遞給與includes方法相同的正確的不可變等效項。