You can reduce your data to a dictionary and then map it to an array like so
results = [ { unit: 5, date: '2015-12-04 00:01:00' },
{ unit: 10, date: '2015-12-04 00:01:00' },
{ unit: 5, date: '2015-12-04 00:31:00' },
{ unit: 9, date: '2015-12-04 00:31:00' },
{ unit: 5, date: '2015-12-04 01:01:00' },
{ unit: 10, date: '2015-12-04 01:01:00' },
{ unit: 10, date: '2015-12-04 01:31:00' },
{ unit: 5, date: '2015-12-04 01:31:00' },
{ unit: 10, date: '2015-12-04 02:01:00' },
{ unit: 5, date: '2015-12-04 02:01:00' },
{ unit: 5, date: '2015-12-04 02:31:00' },
{ unit: 9, date: '2015-12-04 02:31:00' },
{ unit: 5, date: '2015-12-04 03:01:00' },
{ unit: 9, date: '2015-12-04 03:01:00' },
{ unit: 5, date: '2015-12-04 03:31:00' },
{ unit: 10, date: '2015-12-04 03:31:00' },
{ unit: 10, date: '2015-12-04 04:01:00' },
{ unit: 5, date: '2015-12-04 04:01:00' }]
// first make an object with {date: unit} value as such
const newResults = results.reduce[[acc, item] => [{
...acc,
[item.date]: [acc[item.date] || 0] + item.unit
}] , {}]
console.log[newResults]
/*
{
"2015-12-04 00:01:00": 15,
"2015-12-04 00:31:00": 14,
"2015-12-04 01:01:00": 15,
"2015-12-04 01:31:00": 15,
"2015-12-04 02:01:00": 15,
"2015-12-04 02:31:00": 14,
"2015-12-04 03:01:00": 14,
"2015-12-04 03:31:00": 15,
"2015-12-04 04:01:00": 15
}
*/
// now if you want array representation for this you can do
const finalResult = Object.keys[newResults].map[key => [{date: key, unit: newResults[key]}]]
console.log[finalResult]
/*
[
{
"date": "2015-12-04 00:01:00",
"unit": 15
},
{
"date": "2015-12-04 00:31:00",
"unit": 14
},
{
"date": "2015-12-04 01:01:00",
"unit": 15
},
{
"date": "2015-12-04 01:31:00",
"unit": 15
},
{
"date": "2015-12-04 02:01:00",
"unit": 15
},
{
"date": "2015-12-04 02:31:00",
"unit": 14
},
{
"date": "2015-12-04 03:01:00",
"unit": 14
},
{
"date": "2015-12-04 03:31:00",
"unit": 15
},
{
"date": "2015-12-04 04:01:00",
"unit": 15
}
]
*/
Sum a Property in an Array of Objects in JavaScript #
To sum a property in an array of objects:
- Call the
reduce[]
method to iterate over the array. - On each iteration increment the sum with the specific value.
- The result will contain the sum of the values for the specific property.
Copied!
const arr = [ {id: 1, salary: 10}, {id: 2, salary: 20}, {id: 3, salary: 30}, ]; const sum = arr.reduce[[accumulator, object] => { return accumulator + object.salary; }, 0]; console.log[sum]; // 👉️ 60
The function we passed to the Array.reduce[] method gets invoked with each element [object] in the array.
The accumulator
parameter gets an initial value of 0
because that's what we supplied as the second argument to the reduce
method.
We increment the accumulator
by the value of the salary
property for each object in the array.
The reduce
method returns the sum of the salary
values of all objects in the array.
An alternative and perhaps simpler approach is to use the forEach
method.
To sum a property in an array of objects:
- Initialize a
sum
variable, using thelet
keyword and set it to0
. - Call the
forEach[]
method to iterate over the array. - On each iteration, increment the
sum
variable with the value of the object.
Copied!
const arr = [ {id: 1, salary: 10}, {id: 2, salary: 20}, {id: 3, salary: 30}, ]; let sum = 0; arr.forEach[element => { sum += element.salary; }]; console.log[sum]; // 👉️ 60
The function we passed to the Array.forEach method gets called with each element in the array.
Notice that we declared the sum
variable using the let
keyword. We can't reassign variables declared using
const
.
On each iteration of the loop, we increment the value stored in the sum
variable to get the total amount.
This approach is more readable and intuitive, especially if you're not used to how the reduce
method works.
You can also achieve the same result by using a basic for
loop.
Copied!
const arr = [ {id: 1, salary: 10}, {id: 2, salary: 20}, {id: 3, salary: 30}, ]; let sum = 0; for [let index = 0; index