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