使用JS对象初始化不可变映射

时间:2016-12-17 18:28:45

标签: javascript reactjs redux

我想将简单的JS对象保留在redux状态(来自某个请求的非常大的响应)。我有以下减速机:

function reducer(state = new Map(), action) {
  switch (action.type) {
    case SOME_ACTION:
      return state.merge({
        request: action.request
      });
    default:
      return state;
  }
};

问题是action.request是一个非常大的递归树,并且合并操作非常慢。此外,它不是普通的JS,但它会转换为不可变的。我注意到简单地返回新的Map要快得多:

function reducer(state = new Map(), action) {
  switch (action.type) {
    case SOME_ACTION:
      return new Map({
        request: action.request
      });
    default:
      return state;
  }
};

这里的状态包含普通的JS请求字段,速度很快,但是 - 这是一个好方法吗?在redux连接内部的浅层比较仍然可以工作吗?

1 个答案:

答案 0 :(得分:0)

新关键字将始终在内存中创建新对象。让我们试试,以前的状态可以保留如下: -

function reducer(state = new Map(), action) {
  switch (action.type) {
    case SOME_ACTION:
      let mergeStates = {...state,[action.stateIdentificationKey]:action.request}
      return state.merge(mergeStates);
    default:
      return state;
  }
};

stateIdentificationKey用于标识合并状态。每个州都必须发送一个密钥进行识别。

您也可以尝试: -

function reducer(state = new Map(), action) {
  switch (action.type) {
    case SOME_ACTION:
      return new Map({
           ...state,
        request: action.request
      });
    default:
      return state;
  }
};