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的第一个索引“喜欢unshift”,你可以提供一些技巧吗?因为新的Map()。Set()将新项放在Map对象的底部,而且我不想每次都做Map.clear()。
答案 0 :(得分:0)
我认为这不是一个很好的方法。地图的顺序由插入顺序决定,因此如果您想要一个特定的值,那么您唯一的选择就是确保首先插入它。
我也不确定在这种情况下使用Map实际上是个好主意。在Redux中,你不应该像在你的for循环中那样改变状态(修改Map)。这使得地图很难在Redux中使用,因为在您可以安全地使用.set
或.delete
等方法之前,您需要不断制作地图的副本。
Redux的创建者说过(关于Set和Map)
所以我可能会切换回使用一个具有方便的非变异方法的数组,如.map
和.filter
(并使用...
语法),或者可能是一个对象(将ID作为密钥,您可以使用ids
跟踪订单。