NoobAndGo
NoobAndGo

Reputation: 5

How to sum and group array based on first value

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

Answers (4)

utkuonursahin
utkuonursahin

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

Mister Jojo
Mister Jojo

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

Terminat
Terminat

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

aaandri98
aaandri98

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

Related Questions