0

I have multiples arrays for different length , Each array has objects of key ,value pairs .

[{date: "2018-11-26", totalHours: 2},{date: "2018-11-27", totalHours: 2}]
[{date: "2018-11-26", totalHours: 4},{date: "2018-11-27", totalHours: 2},{date: "2018-11-28", totalHours: 8}]
[{date: "2018-11-26", totalHours: 4},{date: "2018-11-27", totalHours: 2},{date: "2018-11-28", totalHours: 6},{date: "2018-11-30", totalHours: 9}]

How to sum the totalHours of same dates considering all arrays?

Hassan Imam
  • 21,956
  • 5
  • 41
  • 51
SAN
  • 326
  • 6
  • 23
  • Concat all arrays into one and then [group by](https://stackoverflow.com/a/53516535/1641941) the date key. – HMR Nov 29 '18 at 11:10

3 Answers3

0

You can use the reduce function as follows:

const x = [{ date: '2018-11-26', totalHours: 2 }, { date: '2018-11-27', totalHours: 2 }]

const sum = x.reduce((a, c) => a + c.totalHours, 0)
console.log(sum) // 4
Jonas Wilms
  • 132,000
  • 20
  • 149
  • 151
ninesalt
  • 4,054
  • 5
  • 35
  • 75
0

You could first create one array with spread syntax and then use reduce method to calculate sum.

let a = [{date: "2018-11-26", totalHours: 2},{date: "2018-11-27", totalHours: 2}]
let b = [{date: "2018-11-26", totalHours: 4},{date: "2018-11-27", totalHours: 2},{date: "2018-11-28", totalHours: 8}]
let c = [{date: "2018-11-26", totalHours: 4},{date: "2018-11-27", totalHours: 2},{date: "2018-11-28", totalHours: 6},{date: "2018-11-30", totalHours: 9}]

let sum = [...a, ...b, ...c].reduce((r, {date, totalHours}) => {
  if(!r[date]) r[date] = totalHours;
  else r[date] += totalHours;
  return r;
}, {})

console.log(sum)
Nenad Vracar
  • 118,580
  • 15
  • 151
  • 176
0

let a = [
    ...[{date: "2018-11-26", totalHours: 2},{date: "2018-11-27", totalHours: 2}],
    ...[{date: "2018-11-26", totalHours: 4},{date: "2018-11-27", totalHours: 2},{date: "2018-11-28", totalHours: 8}],
    ...[{date: "2018-11-26", totalHours: 4},{date: "2018-11-27", totalHours: 2},{date: "2018-11-28", totalHours: 6},{date: "2018-11-30", totalHours: 9}]
];

let result = {};

a.forEach((i) => {
  result[i.date] = result[i.date] || { date: i.date, totalHours: 0 };
  result[i.date].totalHours += i.totalHours;
});

result = Object.values(result)
console.log(result);
Karan
  • 12,059
  • 3
  • 24
  • 40