按属性对象将对象数组减少为总计

时间:2019-03-29 13:13:37

标签: 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]),{})

引发错误:

  

未捕获的TypeError:无法读取未定义的属性'mon'

即使reduce是用{mon:0, tue:0 ...}而不是{}初始化的。

有非循环解决方案吗?

p.s。预期输出是一个对象,其中每个属性是该属性所组成的数组对象的总和,例如{mon:6, tue:3, wed:5, thu:5, fri:8, sat:0, sun:10}就我而言

2 个答案:

答案 0 :(得分:5)

修改后,您需要返回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 :(得分:4)

您需要返回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);