【问题标题】:For loop populating Immutable map with null data points from zero indexFor循环使用来自零索引的空数据点填充不可变映射
【发布时间】:2023-03-05 11:41:01
【问题描述】:

我正在使用不可变的 ngrx 存储来处理我的 Angular 2 应用程序中的数据。我有一个 reducer 将数据从成功的 API 调用转换为不可变存储的 id 到对象的映射:sessions: Map<number, ISession>。要从 action.payload 中的原生数组 ISession[] 转换,我在 withMutations 调用中执行了一个 foreach 循环:

case SessionsActions.LOAD_SESSIONS_SUCCESS:
  return state.withMutations(map => {
    map.set('loading', false);

    action.payload.forEach((session: ISession) => {
      console.log("Setting ",session);
      map.setIn(['sessions', session.id], session );
    });
  }) as ISessions;

我得到了预期的控制台输出,共有四项:

Setting  Object {id: 6, payslip: null, invlice: null, paidByClient: false, completed: false…}
Setting  Object {id: 8, payslip: null, invlice: 1, paidByClient: true, completed: false…}
Setting  Object {id: 9, payslip: 1, invlice: 1, paidByClient: true, completed: false…}
Setting  Object {id: 7, payslip: null, invlice: null, paidByClient: false, completed: false…}

但是商店里装满了 10 件商品,它从 0 到存储数据本身的最大值 (9) 填充 id 的空值:

知道为什么会发生这种行为吗?

【问题讨论】:

    标签: angular immutable.js ngrx


    【解决方案1】:

    我通过手动构建地图并使用set而不是setIn进行设置解决了这个问题:

      case SessionsActions.LOAD_SESSIONS_SUCCESS:
      var state = state.withMutations(map => {
        map.set('loading', false);
    
        var sessions = Map<String, ISession>();
        for (var i = 0; i < action.payload.length; i++)
        {
          var session = action.payload[i];
          sessions = sessions.set(session.id, session );
        }
        map.set('sessions', sessions);
      }) as ISessions;
    

    我认为这是 withMutations 函数的一些错误。

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2014-04-09
      相关资源
      最近更新 更多