Использование функции Array.reduce с объектами в приложении NgRx

В проекте 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 })

Заранее благодарю вас за то, что помогли мне пролить свет на это.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
977
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Представь это

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'. Это ничем не отличается от использования любой другой строки.

Спасибо за помощь. Согласны ли мы в редукторе с исходным значением накопителя {id: '0', message: 'work', done: false}? Это не массив, почему мы можем использовать это: accumulateur [iteration.id] = iteration;

Slrg 19.04.2018 11:53

Начальное значение - { '0': { id: '0', message: 'Hello', done: false } }. Вы можете установить значения свойств для таких объектов: const x = {}x['0'] = 'hello '.

Tomasz Kula 19.04.2018 11:55

Мне это помогло. Спасибо !

Slrg 19.04.2018 14:42

Другие вопросы по теме