2017-09-24 27 views
0
const { items, ids } = action.payload; 
    const { fetchedItems } = state; 
    const diff = _.difference(state.ids, action.payload.ids); 
    // @APPEND 
    for (let i = 0; i < items.length; i++) { 
    fetchedItems.set(items[i].id, items[i]); 
    } 
    // @DELETE 
    for (let i = 0; i < diff.length; i++) { 
    fetchedItems.delete(diff[i]); 
    } 
    const myArray = Array.from(fetchedItems.values()); 
    return { 
    ...state, 
    items: Array.from(fetchedItems.values()), // not for use 
    fetchedItems, 
    ids: action.payload.ids, 
    syncStatus: action.payload.tocMeta.syncStatus 
    }; 

Quesstion是:基於套接字和每一個我是接受新對象,我的API,我爲便於更新使用Map對象,並刪除和一切工作不錯,我想設置新的項目來自action.payload對象的第一個索引的地圖「像不移」,你能提供一些技巧嗎?因爲新的Map().Set()將新項目放在Map對象的底部,我不想每次都做Map.clear()。到開頭添加項目映射對象與「不印字法」

回答

0

我不認爲有一個很好的方法來做到這一點。地圖的順序由插入順序決定,所以如果你想要一個特定的值作爲第一個,那麼你唯一的選擇就是看它是先插入的。

我也不確定在這種情況下使用Map實際上是一個好主意。在Redux中,你不應該像你在for循環中那樣改變狀態(修改Map)。這使得Maps很難在Redux中使用,因爲在安全使用諸如.set.delete之類的方法之前,您需要不斷製作地圖副本。

終極版的創建者說(約set和map)

I don’t think it’s a good idea to use them in Redux because they are optimized for mutability. If you want to have something efficient with similar semantics, consider using Immutable.js.

所以我可能會切換回使用具有方便的非突變的方法,如.map.filter數組(並與...語法一起使用),或者可能是一個對象(id爲key,並且您可以使用ids來跟蹤訂單)。

+1

Thx很多你的時間! –

+0

不客氣!很高興我能幫上忙! – jonahe