如何根据第一个值对数组求和和分组

How to sum and group array based on first value

我需要对数组的第二个值求和并根据第一个值(年份)对其进行分组。

这是我的数组:

dataArray = [[2020,140],[2020,145],[2020,90],[2021,88],[2021,12]];

这是我的职能:

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;
}, {});

我需要这个结果:

dataArray = [[2020,375],[2021,100]]

但是我得到了奇怪的结果,我认为是基于先前值的总和。

有人可以帮助我吗? 谢谢

您可以通过以下方式简化计算:

Object.entries(
    dataArray.reduce(function(res, value) {
        if (!res[value[0]]) {
            res[value[0]] = 0;
        }

        res[value[0]] += value[1];

        return res;
    }, {})
);

顺便说一下,您的代码在浏览器控制台上运行

你可以做到

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 )

使用 JavaScript 地图对象

更简洁的解决方案

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

可能不是最好的选择,但希望对您有所帮助。

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)