Example 1: Group by property
( StackBlitz | jsBin | jsFiddle )
// RxJS v6+import { from } from 'rxjs';import { groupBy, mergeMap, toArray } from 'rxjs/operators';const people = [{ name: 'Sue', age: 25 },{ name: 'Joe', age: 30 },{ name: 'Frank', age: 25 },{ name: 'Sarah', age: 35 }];//emit each personconst source = from(people);//group by ageconst example = source.pipe(groupBy(person => person.age),// return each item in group as arraymergeMap(group => group.pipe(toArray())));/*output:[{age: 25, name: "Sue"},{age: 25, name: "Frank"}][{age: 30, name: "Joe"}][{age: 35, name: "Sarah"}]*/const subscribe = example.subscribe(val => console.log(val));
Example 2: Group by into key - values
( StackBlitz )
// RxJS v6+import { from, of, zip } from 'rxjs';import { groupBy, mergeMap, toArray } from 'rxjs/operators';const people = [{ name: 'Sue', age: 25 },{ name: 'Joe', age: 30 },{ name: 'Frank', age: 25 },{ name: 'Sarah', age: 35 }];from(people).pipe(groupBy(person => person.age,p => p.name),mergeMap(group => zip(of(group.key), group.pipe(toArray())))).subscribe(console.log);/*output:[25, ["Sue", "Frank"]][30, ["Joe"]][35, ["Sarah"]]*/
groupBy 📰 - Official docs
Group higher order observables with RxJS groupBy
🎥 💵 - André Staltz
Use groupBy in real RxJS applications
🎥 💵 - André Staltz
📁 Source Code: https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/groupBy.ts