Reputation: 5
I need to sum the second value of an array and group it based on the first value (year).
This is my array:
dataArray = [[2020,140],[2020,145],[2020,90],[2021,88],[2021,12]];
And this is my function:
var result = [];
dataArray.reduce(function (res, value) {
if (!res[value[0]]) {
res[value[0]] = [value[0], 0];
dataArray.push(res[value[0]]);
}
res[value[0]][1] += value[1];
return res;
}, {});
I need this result:
dataArray = [[2020,375],[2021,100]]
But I got strange result, I think based on sum of previous value.
Can someone help me? Thank you
Upvotes: 0
Views: 96
Reputation: 469
Probably isn't the best option but I hope it helps you.
let dataArray = [[2020,140],[2020,145],[2020,90],[2021,88],[2021,12]]
const sumOdds = function(arr){
let sum = 0
for(i=0; i<arr.length; i++){
if(i%2 != 0) sum+= arr[i]
}
return sum
}
const twenties = dataArray.filter(arr => arr.includes(2020)).flat()
const twentyOnes = dataArray.filter(arr => arr.includes(2021)).flat()
const twentiesSum = sumOdds(twenties)
const twentyOnesSum = sumOdds(twentyOnes)
dataArray = [[2020, twentiesSum],[2021, twentyOnesSum]]
console.log(dataArray)
Upvotes: 0
Reputation: 22265
you can do that
const
dataArray = [[2020,140],[2020,145],[2020,90],[2021,88],[2021,12]]
, result =
dataArray.reduce((sums,[year,value])=>
{
let sYear = sums.find(x=>x[0]===year)
if (!sYear) sums.push([year,value])
else sYear[1] += value
return sums
},[])
console.log( result )
.as-console-wrapper {max-height: 100%!important;top:0 }
or:
const
dataArray = [[2020,140],[2020,145],[2020,90],[2021,88],[2021,12]]
, result2 =
Object.entries(
dataArray.reduce((sums,[year,value])=>
{
sums[year] = (sums[year] ?? 0) + value
return sums;
}, {}))
console.log( result2 )
Upvotes: 0
Reputation: 1237
A bit more clean solution with JavaScript Map Object
const dataArray = [[2020,140],[2020,145],[2020,90],[2021,88],[2021,12]];
var result = new Map();
dataArray.forEach((el) => {
let val = result.get(el[0]);
if(!val) {
result.set(el[0], el[1])
} else {
result.set(el[0], el[1] + val)
}
})
console.log([...result]);
Upvotes: 0
Reputation: 605
You can simplify the computation by doing:
Object.entries(
dataArray.reduce(function(res, value) {
if (!res[value[0]]) {
res[value[0]] = 0;
}
res[value[0]] += value[1];
return res;
}, {})
);
By the way, your code is working on browser console
Upvotes: 2