Уменьшить массив до объекта, используя функцию стрелки
Я играю с ограничениями функций массива и стрелок и пытаюсь преобразовать эту функцию сокращения в функцию стрелок:
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);