如何计算角度6中表列的总和?

时间:2018-10-22 07:53:09

标签: javascript angularjs ngfor

我有一个根据用户选择开始动态过滤的表(管道)。

我需要在底部输入一个汇总行,以显示item.total列的总和,这是代码,实现它的最佳方法是什么?

  <tbody>
      <tr class="newLine" *ngFor="let item of records | filter:profile | location:selectedRegion ">
        <td scope="row">{{item.name}} </td>
        <td scope="row">{{item.profile}} </td>
        <td scope="row">{{item.location}} </td>
        <td scope="row">{{item.numOfTags}}</td>
      </tr>
      <tr>{{total numOfTags??}}</tr>
  </tbody>

4 个答案:

答案 0 :(得分:1)

创建一个新的过滤器管道,以计算当前过滤器的总和

import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
  name: 'filtercount'
})
export class FilterPipe implements PipeTransform {
  transform(items: any[], searchText: string): any[] {
    if(!items) return [];
    if(!searchText) return items;
searchText = searchText.toLowerCase();
return items.filter( it => {
      return it.name.toLowerCase().includes(searchText);
    }).reduce((a, b) => a.total + b.total, 0);
   }
}

并像这样使用它

{{records | filtercount:profile}}

答案 1 :(得分:1)

我找到了另一种方法来再现性能更好的代码,这是代码:

<div    *ngFor="let item of records | yourfilterChain;let last=last;let sum=ngForOf.reduce((a,b)=>a+b,0)" >
     {{item}}
     <div *ngIf="last">{{sum}} </div>
</div>

您可以使用ngfor中的箭头功能计算过滤结果的总和

答案 2 :(得分:0)

这是一个非常简单的任务,但是大多数UI开发人员都停留在这一点上。因此,让我们讨论一下。

如果我们已经从任何Web Service获得了响应(JSON格式),即对象数组-

0: {REFUND: 0, PAYMENTCANCELLED: 0, PENDING_RECHARGE: 11, OUTLIER: 0, CHANNEL: "JIO.COM", …}
1: {REFUND: 0, PAYMENTCANCELLED: 65, PENDING_RECHARGE: 0, OUTLIER: 0, CHANNEL: "JIO.COM", …}
2: {REFUND: 0, PAYMENTCANCELLED: 31, PENDING_RECHARGE: 393, OUTLIER: 0, CHANNEL: "MYJIO", …}
3: {REFUND: 0, PAYMENTCANCELLED: 319, PENDING_RECHARGE: 1, OUTLIER: 0, CHANNEL: "MYJIO", …}

让我们考虑将上面的响应加载为

this.FttxRechargeReportRes = response.responsePayload;

上述事情是每个人都可以理解的普遍现象。现在,获取各个键的每个值的总和。

  getSum(){
    debugger;
    console.log(this.FttxRechargeReportRes );
    let sumArr = this.FttxRechargeReportRes .reduce((acc, cur) => {
      for (let key in cur) {
        // console.log(key, cur, acc);
        if (key !== 'RTYPE' && key !== 'CHANNEL') {  // "We did this because there was only characters in RTYPE & CHANNEL , so we could not get sum of same."
          if (acc[key]) {
            acc[key] += cur[key]
          } else {
            acc[key] = cur[key]
          }
        }
      }
      return acc;
    }, {})

    console.log(sumArr);
this.arrData=sumArr;
console.log(this.arrData);


  }

当您打印 arrData 时,将得到以下输出:-

{
REFUND: 0
PAYMENTCANCELLED: 415
PENDING_RECHARGE: 405
OUTLIER: 0
RECHARGE_SUCCESS: 15212
PAYMENTSUCCESS: 15617
PAYMENT_INITIATED: 23333
TOTAL_RECHARGE: 39365
}

您只需要用html打印即可。

答案 3 :(得分:0)

我来晚了,但我认为共享fieldSum管道会很有用。

当您具有对象列表并且要发布其中一个字段的总和时。

import { Pipe, PipeTransform } from '@angular/core';

/**
 * Pipe to return the sum of `attr` fields in `items`
 */
@Pipe({
  name: 'fieldSum'
})
export class FieldSumPipe implements PipeTransform {
  transform(items: any[], attr: string): number {
    // console.log('items:', items, 'attr:', attr);
    return items.reduce((a, b) => a + b[attr], 0);
  }
}

使用方式:

{{ items | fieldSum:'qty' }}

将此管道实现计数,平均值等作为参考是不重要的。