循环遍历对象数组,并按ID引用返回sum



我正在获取一个包含一组对象的对象,并尝试在它们之间循环,以通过id引用对数据求和。

如果我有这样的函数,这可能更容易展示而不是解释。。。

let projectArray = this.projects
projectArray.forEach(function (el) {
console.log(el.categoriesTotal)
})

我得到了一个很好的数组返回,其中包含我想要的对象,看起来像这样。。。。。

[
{ _id: 6, total: 4478.4 },
{ _id: 1, total: 110248.13 },
{ _id: 7, total: 663695.1 }
]
[
{ _id: 7, total: 31278 },
{ _id: 1, total: 67174.66 },
{ _id: 4, total: 3712.8 },
{ _id: 8, total: 670 }
]
...

我想做的是通过id引用返回总数,例如

_id: 1, total: 177422.79,
_id: 6, total: 4478.4

我想我想要的方法是"reduce",但我试着按照这个答案进行操作,但我得到了一个错误,告诉我"reduce不是一个函数",可能是因为我试图"reduce"多个数组。

如何返回这些数组的总和?

const data = [
[
{ _id: 6, total: 4478.4 },
{ _id: 1, total: 110248.13 },
{ _id: 7, total: 663695.1 }
],
[
{ _id: 7, total: 31278 },
{ _id: 1, total: 67174.66 },
{ _id: 4, total: 3712.8 },
{ _id: 8, total: 670 }
]
];
let temp = {};
data.forEach( arrayOfObjects => {
arrayOfObjects.forEach( obj => {
if(temp[obj._id] != null) {
temp[obj._id] += obj.total
}else{
temp[obj._id] = obj.total
}
})
})
let result = [];
for ( [key,value] of Object.entries(temp) ){
result.push({ _id: key*1, total: value })
}
console.log(result)

您应该能够使用Array.flat((来压平数组,然后使用reduce来获得所需的结果,例如

let a = [[
{ _id: 6, total: 4478.4 },
{ _id: 1, total: 110248.13 },
{ _id: 7, total: 663695.1 }
],
[
{ _id: 7, total: 31278 },
{ _id: 1, total: 67174.66 },
{ _id: 4, total: 3712.8 },
{ _id: 8, total: 670 }
]];
let result = Object.values(a.flat().reduce((map, r) => { 
if (!map[r._id]) map[r._id] = { _id: r._id, total: 0};
map[r._id].total += r.total;
return map;
}, {}));
console.log(result);

您可以使用Array.prototype.flat来压平数组,然后只使用reduce来聚合总和。

var projectArray = [[
{ _id: 6, total: 4478.4 },
{ _id: 1, total: 110248.13 },
{ _id: 7, total: 663695.1 }
],
[
{ _id: 7, total: 31278 },
{ _id: 1, total: 67174.66 },
{ _id: 4, total: 3712.8 },
{ _id: 8, total: 670 }
]];
var result = projectArray.flat().reduce( (acc,i) => {
if(acc.hasOwnProperty(i._id))
acc[i._id] += i.total;
else
acc[i._id] = i.total;
return acc;
},{});
console.log(result);

相关内容

  • 没有找到相关文章