如何对对象值数组求和并将它们分配给相关的键名

How to sum the array of object values and assigned them to the relevant key name

我需要了解执行此操作的最简单方法。 我有一个对象数组:

const data = [
  {
    group: 'A',
    incomes: {
      "2019-12": 100,
      "2020-12": 200,
      "2021-12": 15
    }
  },
  {
    group: 'B',
    incomes: {
      "2019-12": 25,
      "2020-12": 50,
    }
  }
]

我想要得到的是一个简单的对象,它的键是 data.incomes 的月份,值是相对月份值的总和,所以最终结果如下:

const totalIncomes = {
  "2019-12": 125,
  "2020-12": 250,
  "2021-12": 15
}

谁能一步步给我解释一下?

使用 reduce 和 forEach 解决

在 reduce 函数中,我在 incomes object/attribute 的键数组上 运行 一个 forEach。对于作为日期的每个键,我正在检查 reduce 函数的累加器是否包含每个日期的属性,如果没有则创建。创建属性后,我对当前日期属性的值求和。

const data = [
  {
    group: 'A',
    incomes: {
      "2019-12": 100,
      "2020-12": 200,
      "2021-12": 15
    }
  },
  {
    group: 'B',
    incomes: {
      "2019-12": 25,
      "2020-12": 50,
    }
  }
]

const totalIncomes = data.reduce((acc,curr)=> {
    Object.keys(curr.incomes).forEach((key, index) => {
   if(!acc[key]){
        acc[key] = 0;
   }
   acc[key]+=curr.incomes[key]
  });
   return acc;
},{})

console.log(totalIncomes)

也许这不是漂亮的解决方案,但你可以这样做,这个功能当然不是必需的。

const data = [
  {
    group: "A",
    incomes: {
      "2019-12": 100,
      "2020-12": 200,
      "2021-12": 15,
    },
  },
  {
    group: "B",
    incomes: {
      "2019-12": 25,
      "2020-12": 50,
    },
  },
];

getterInformation(data);

function getterInformation(object) {
  let objectWithCalculatedValues = {};

  object.forEach((items) => {
    for (const key in items.incomes) {
      if (objectWithCalculatedValues[key] === undefined) {
        objectWithCalculatedValues[key] = 0;
      }

      objectWithCalculatedValues[key] += items.incomes[key];
    }
  });

  console.log(objectWithCalculatedValues);
}

假设此信息可能对可能无法获得必要指导(由于各种可能的原因)的读者有用,这里是实现objective(解决方案)的一种可能方法:

const aggregateIncomesByMonth = () => (
  data.map(d => Object.entries(d.incomes).map(([k, v]) => ({
    key: k,
    value: v
  }))).flat().reduce((fin, itm) => ({
    ...fin,
    [itm.key]: (fin[itm.key] || 0) + itm.value
  }), {})
);

说明

  1. 仅从 data 数组中提取 incomes
  2. 对每个income对象,得到键值对,转化为结构体的另一个对象{key: 20yy-mm, value: nn}
  3. 使用.flat()将步骤2的结果转换为一维数组
  4. 对于 key(即 20yy-mm)匹配的情况,使用 .reduce 求和 value

代码片段

const data = [{
    group: 'A',
    incomes: {
      "2019-12": 100,
      "2020-12": 200,
      "2021-12": 15
    }
  },
  {
    group: 'B',
    incomes: {
      "2019-12": 25,
      "2020-12": 50,
    }
  }
];

const aggregateIncomesByMonth = () => (
  data.map(d => Object.entries(d.incomes).map(([k, v]) => ({
    key: k,
    value: v
  }))).flat().reduce((fin, itm) => ({
    ...fin,
    [itm.key]: (fin[itm.key] || 0) + itm.value
  }), {})
);

console.log(aggregateIncomesByMonth());

我这里的做法是解构数组。这样我就得到了变量 A 中 A 组收入的所有数据,B.

也一样

然后我执行一个双循环来比较两个对象的数据并查看日期是否匹配。如果是,则对收入求和并将数据添加到 total 对象。

const data = [
  {
    group: 'A',
    incomes: { "2019-12": 100, "2020-12": 200, "2021-12": 15 }
  },
  {
    group: 'B',
    incomes: { "2019-12": 25, "2020-12": 50 }
  }
]

let A, B, total = {};

[A, B] = [data[0].incomes, data[1].incomes]

for(const date in A){
  for(const d in B){
   total[date] = date === d ? A[date] + B[date] : A[date]
  }  
}

console.log(total)