如何对对象值数组求和并将它们分配给相关的键名
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
}), {})
);
说明
- 仅从
data
数组中提取 incomes
- 对每个
income
对象,得到键值对,转化为结构体的另一个对象{key: 20yy-mm, value: nn}
- 使用
.flat()
将步骤2的结果转换为一维数组
- 对于
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)
我需要了解执行此操作的最简单方法。 我有一个对象数组:
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
}), {})
);
说明
- 仅从
data
数组中提取incomes
- 对每个
income
对象,得到键值对,转化为结构体的另一个对象{key: 20yy-mm, value: nn}
- 使用
.flat()
将步骤2的结果转换为一维数组 - 对于
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)