使用“unshift”方法将项添加到Map对象的开头

时间:2017-09-24 15:07:08

标签: javascript reactjs dictionary redux

  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()。

1 个答案:

答案 0 :(得分:0)

我认为这不是一个很好的方法。地图的顺序由插入顺序决定,因此如果您想要一个特定的值,那么您唯一的选择就是确保首先插入它。

我也不确定在这种情况下使用Map实际上是个好主意。在Redux中,你不应该像在你的for循环中那样改变状态(修改Map)。这使得地图很难在Redux中使用,因为在您可以安全地使用.set.delete等方法之前,您需要不断制作地图的副本。

Redux的创建者说过(关于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作为密钥,您可以使用ids跟踪订单。