开发者问题收集

在 NgRx 应用程序中将 Array.reduce 函数与对象结合使用

2018-04-19
1378

在 NgRx Angular 5 项目中,reduce 函数的用法我不太明白。希望得到一些帮助

基本上,代码迭代一个对象数组,该数组如下所示:

[{
   id: '0',
   message: 'work',
   done: false
 },
 {
   id: '1',
   message: 'movie',
   done: false
 },
 {
   id: '2',
   message: 'Play',
   done: false
 }]

在我的 NgRx Reducer 中,有以下代码块:

case todosAction.FETCH_TODO_SUCCESS: {
  return {
    ...state,
    //action.payload contains above array of objects
    datas: action.payload.reduce((accumulateur, iteration) => {
      accumulateur[iteration.id] = iteration;
      return accumulateur;
    }, { ...state.datas }),
    loading: false,
    loaded: true,
    error: null 
  };
}

我使用的状态如下所示:

export interface TodoState {
  datas: {
    [todoId: string]: Todo
  }
  loading: boolean;
  loaded: boolean;
  error: any;
}

我们在这里使用 Reduce 函数将原始源(一个对象数组)转换为实体(一个与 todo 对象关联的 id)。 我理解我们使用这个函数的原因,但我不明白它的内部代码:

action.payload.reduce((accumulateur, iteration) => {
          accumulateur[iteration.id] = iteration; // <-- AS FAR AS I UNDERSTAND, ACCUMULATOR IS NOT AN ARRAY, HOW CAN WE ACHIEVE SUCH A THING
          return accumulateur;
        }, { ...state.datas })

提前感谢您帮助我阐明这一点。

1个回答

假设

state.datas 等于:

{
  '0': {
    id: '0',
    message: 'Hello',
    done: false
  }
}

action.payload 等于

[{
  id: '1',
  message: 'World',
  done: false
}]

在 Reducer 返回后,您将得到

{
  '0': {
    id: '0',
    message: 'Hello',
    done: false
  },
  '1': {
    id: '1',
    message: 'World',
    done: false
  }
}

需要注意的重要一点是,id 是一个字符串。您可以拥有一个键为 '0' 的对象。这与使用任何其他字符串没有什么不同。

Tomasz Kula
2018-04-19