Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular 2 pipe - calculating summary of array of objects

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)

like image 594
bensiu Avatar asked Feb 10 '17 17:02

bensiu


1 Answers

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;
}
like image 189
Christopher Moore Avatar answered Oct 22 '22 10:10

Christopher Moore