Reputation: 25564
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)
Upvotes: 12
Views: 12884
Reputation: 3099
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;
}
Upvotes: 26