Уменьшить массив объекта до итогов по свойству объекта

#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);