0

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

4 Answers 4

2

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

Sign up to request clarification or add additional context in comments.

Comments

0

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 )

Comments

0

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]);

Comments

0

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.