Angular 2 pipe - calculating summary of array of objects

bensiu picture bensiu · Feb 10, 2017 · Viewed 8.6k times · Source

I have list of objects with balances (there are other properties in objects but not imported for example):

[{ balance : 100 },{ balance : 200 },{ balance : null },{ balance : 300 }]

I am looking for smart pipe that would sum (other would average) balances in array (would prefer not using for loop - but some ES6 functionality like reduce but not sure how)

Answer

Christopher Moore picture Christopher Moore · Feb 10, 2017

You will need to write your own pipe, below should give you what you are after. It takes the attribute of the object you want to sum as a parameter

Sum

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

@Pipe({
    name: 'sum'
})
export class SumPipe implements PipeTransform {
    transform(items: any[], attr: string): any {
        return items.reduce((a, b) => a + b[attr], 0);
    }
}

Use it how you would any other pipe

<span>{{ balances | sum:'balances' }}</span>

Average

For an average pipe, just use the similar logic as the sum pipe. This treats null as 0.

transform(items: any, attr: string): any {
    let sum = items.reduce((a, b) => a + b[attr], 0);
    return sum / items.length;
}