我尝试使用类别和子类别数据继续求和,但不得不说很难得到正确的语法。
这是我的数据:
{ id : 1, category: 12, subcategory: 14, inv_amt: 470 },
{ id : 2, category: 12, subcategory: 14, inv_amt: 660 },
{ id : 3, category: 12, subcategory: 15, inv_amt: 605 },
{ id : 4, category: 13, subcategory: 14, inv_amt: 4760 },
{ id : 5, category: 13, subcategory: 16, inv_amt: 6600 },
{ id : 6, category: 13, subcategory: 16, inv_amt: 6050 },
{ id : 7, category: 14, subcategory: 17, inv_amt: 460 }
我想按类别和子类别获取总金额,如:
for category = 12
subcategory : 14 => Sum = 1130
subcategory : 15 => Sum = 605
for (category = 13) :
subcategory : 14 => Sum = 4760
subcategory : 16 => Sum = 12650
for (category = 14) :
subcategory : 17 => Sum = 460
我使用这段代码给了我一个类别的总和。
this.totalCreances = this.creances
.filter(c => c.category === remise.category)
.map(c => c.inv_amt)
.reduce((sum, current) => sum + current);
给出一个结果(数字)
我尝试添加第二个过滤器(在地图上),但它不起作用。
如何对第一个结果进行第二次选择?
谢谢, 衣
答案 0 :(得分:1)
您可以使用array.reduce
实现此目的items.reduce<{[id:number]: {[id:number]: number}}>((acc, cur) => {
if (cur.category in acc) {
if (cur.subcategory in acc[cur.category]) {
acc[cur.category][cur.subcategory] += cur.inv_amt;
} else {
acc[cur.category][cur.subcategory] = cur.inv_amt;
}
} else {
acc[cur.category] = {
[cur.subcategory]: cur.inv_amt
}
}
return acc;
}, {});
这将生成一个包含数据的对象。使用示例数据,该对象如下所示:
{ '12': { '14': 1130, '15': 605 },
'13': { '14': 4760, '16': 12650 },
'14': { '17': 460 } }
然后,您可以遍历该对象以打印出各种总数。
您正在寻找的通用形式称为groupBy。你可以找到JS的实现,如果你愿意,可以使用它。
还有另一种方法可以做到这一点,虽然稍慢但可能更直观。这包括印刷步骤。
let uniqueCategories = [...new Set(items.map(x => x.category))];
uniqueCategories.forEach(category => {
console.log(`for (category = ${category}) :`);
// get entries with a category
let subcategories = [...new Set(items.filter(x => x.category === category).map(x => x.subcategory))];
subcategories.forEach(subcategory => {
let sum :number = items.filter(x => x.category === category && x.subcategory === subcategory)
.reduce((acc, cur) => acc + cur.inv_amt, 0);
console.log(`subcategory : ${subcategory} => Sum = ${sum}`)
});
});
你得到类别,你循环通过它们,你得到子类别,你循环它们。您每次都要过滤掉整个列表。