如何根据数组项属性在typescript数组中对值求和?

86

我正在开发一个小的Angular项目。我有一个收据条目的数组,比如可乐、芬达、百事可乐、果汁等,当然还有它们的价格和数量。

receiptItems: Array<ReceiptItem>;

这就是 ReceiptItem 的样子:

export class ReceiptItem {

  public id: string;
  public product: Product;
  public unitOfMeasure: UnitOfMeasure;
  public discount: number;
  public price: number;
  public quantity: number;
  public total: number;
  public tax:Tax;

 }

我如何在TypeScript中获取总金额的总和,但仅在属性税为“25%”时才计算?

在C#中,我记得我使用过像这样的Lambda表达式:

IEnumerable<ReceiptItems> results = receiptItems.Where(s => s.Tax == "25.00");
   totalSum = results.Sum(x => (x.TotalAmount));
如何在TypeScript / Angular中实现类似的功能?
1个回答

169

JavaScript/TypeScript中的数组也有这些方法。您可以使用filter筛选出符合条件的项,然后使用reduce聚合函数对这些项求和。

const sum = receiptItems.filter(item => item.tax === '25.00')
                        .reduce((sum, current) => sum + current.total, 0);

item.tax === '25.00' - 您必须根据自己的逻辑调整此部分


1
这行代码的含义是什么?reduce((sum, current) => sum + current.total, 0); - Roxy'Pro
1
reduce是一种类似于C#中的Aggregate的聚合函数。它会获取每个迭代项的总数,并在此过程中将每个项的total相加到total(总和)中,最终得出总和。 - Suren Srapyan
@Roxy'Pro:JavaScript 没有直接等价于 Sum() LINQ 函数的方法。但是可以使用 Aggregate() 来编写 Sum() - Romain Deneau
我喜欢像你这样的分割操作:先用 filter 过滤,然后用 reduce 求和。 - Romain Deneau
4
请注意,由于筛选器会产生一个中间数组,在receiptItems包含大量项的情况下,过滤部分可以直接在reduce中完成:receiptItems.reduce((sum, x) => sum + (x.tax === '25.00' ? x.total : 0)); - Romain Deneau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接