如何从category / subcategory计算小计和 - TypeScript / Angular2

时间:2016-09-02 18:24:53

标签: sorting angular typescript sum

我尝试使用类别和子类别数据继续求和,但不得不说很难得到正确的语法。

这是我的数据:

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

给出一个结果(数字)

我尝试添加第二个过滤器(在地图上),但它不起作用。

如何对第一个结果进行第二次选择?

谢谢, 衣

1 个答案:

答案 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}`)
    });
});

你得到类别,你循环通过它们,你得到子类别,你循环它们。您每次都要过滤掉整个列表。