Уменьшить массив до объекта, используя функцию стрелки

Я играю с ограничениями функций массива и стрелок и пытаюсь преобразовать эту функцию сокращения в функцию стрелок:

var monthsById = months.reduce(function(result, month) {
                            result[month.Id] = month;
                            return result;
                        }, {});

Но у меня проблемы с возвратом карты, так как result[month.Id] = month; вернет месяц, а не карту, как в этом подходе:

var monthsById = months.reduce((byId, month) => byId[month.Id] = month, {});

Поэтому я ищу один оператор, который устанавливает значение И возвращает объект. (new Map() это не вариант, так как он мне нужен в обычном {} формат).

var months = [ { Id: 1 }, { Id: 2 }, { Id: 3 } ];

var monthsById = months.reduce((byId, month) => byId[month.Id] = month, {});

console.log(monthsById);

2 ответа

Решение

Вы можете вернуться byId в каждой итерации и оборачивать тело функции в скобки ()

var months = [ { Id: 1 }, { Id: 2 }, { Id: 3 } ];

var monthsById = months.reduce((byId, month) => (byId[month.Id] = month, byId), {});
console.log(monthsById);

Вы могли бы использовать Object.assignгде вы устанавливаете новое свойство с вычисленными именами свойств и возвращаете весь объект

var months = [ { Id: 1 }, { Id: 2 }, { Id: 3 } ];

var monthsById = months.reduce((byId, month) => Object.assign(byId, { [month.Id]: month }), {});

console.log(monthsById);

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