В проекте NgRx Angular 5 используется функция уменьшения, которую я не совсем понимаю. Я был бы признателен за помощь
В основном код выполняет итерацию по массиву объектов, и массив выглядит так:
[{
id: '0',
message: 'work',
done: false
},
{
id: '1',
message: 'movie',
done: false
},
{
id: '2',
message: 'Play',
done: false
}]
В моем редукторе NgRx есть следующий блок кода:
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;
}
Здесь мы используем функцию сокращения, чтобы преобразовать исходный источник, который представляет собой массив объектов, в сущности (ключ, который является идентификатором, связанным с объектом todo).
Я понимаю причину, по которой мы используем эту функцию, но не понимаю ее внутренний код:
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 })
Заранее благодарю вас за то, что помогли мне пролить свет на это.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Представь это
state.datas равно:
{
'0': {
id: '0',
message: 'Hello',
done: false
}
}
action.payload равно
[{
id: '1',
message: 'World',
done: false
}]
После возврата редуктора вы получите
{
'0': {
id: '0',
message: 'Hello',
done: false
},
'1': {
id: '1',
message: 'World',
done: false
}
}
Важно отметить, что идентификатор - это строка. У вас может быть объект с ключом '0'. Это ничем не отличается от использования любой другой строки.
Начальное значение - { '0': { id: '0', message: 'Hello', done: false } }. Вы можете установить значения свойств для таких объектов: const x = {}x['0'] = 'hello '.
Мне это помогло. Спасибо !
Спасибо за помощь. Согласны ли мы в редукторе с исходным значением накопителя {id: '0', message: 'work', done: false}? Это не массив, почему мы можем использовать это: accumulateur [iteration.id] = iteration;