#javascript #ecmascript-6
#javascript #ecmascript-6
Вопрос:
Я ищу умный способ ES6 уменьшить массив объектов до итогов по свойству объекта.
для примера данных:
const src = [{mon:1,tue:0,wed:3,thu:5,fri:7,sat:0,sun:4}, {mon:5,tue:3,wed:2,thu:0,fri:1,sat:0,sun:6}];
следующий код:
const res = src.reduce((totals,item) => Object.keys(item).forEach(weekday => totals[weekday] = item[weekday]),{})
выдает ошибку:
Неперехваченная ошибка типа: не удается прочитать свойство ‘mon’ неопределенного
даже если reduce
инициализируется с помощью {mon:0, tue:0 ...}
вместо {}
.
Существует ли решение, отличное от for-цикла?
p.s. ожидаемый результат — это объект, где каждое свойство представляет собой сумму объектов массива по этому свойству, например, {mon:6, tue:3, wed:5, thu:5, fri:8, sat:0, sun:10}
в моем случае
Ответ №1:
Вам нужно вернуться totals
после его изменения:
const src = [{mon:1,tue:0,wed:3,thu:5,fri:7,sat:0,sun:4}, {mon:5,tue:3,wed:2,thu:0,fri:1,sat:0,sun:6}];
const res = src.reduce((totals, item) => {
Object.keys(item).forEach(weekday => totals[weekday] = (totals[weekday] || 0) item[weekday]);
return totals;
}, {});
console.log(res);
Комментарии:
1. Я не могу поверить, что это было так близко. Большое спасибо.
Ответ №2:
Вам нужно вернуть totals
в качестве накопителя для reduce
.
Если у вас всегда есть все дни в объектах, и вы не возражаете против изменения первого объекта, вы могли бы работать без начального объекта.
const
src = [{ mon: 1, tue: 0, wed: 3, thu: 5, fri: 7, sat: 0, sun: 4 }, { mon: 5, tue: 3, wed: 2, thu: 0, fri: 1, sat: 0, sun: 6 }],
res = src.reduce((totals, item) =>
(Object.keys(item).forEach(d => totals[d] = item[d]), totals));
console.log(res);