import * as Rxjs from 'rxjs' ; import * as op from 'rxjs/operators' ; export function play ( ... args ) { interface Obj { id : number ; name : string ; } const observable$ = Rxjs . of ( { id : 1 , name : 'javascript' } , { id : 2 , name : 'parcel' } , { id : 2 , name : 'webpack' } , { id : 1 , name : 'typescript' } , { id : 3 , name : 'tslint' } ) . pipe ( op . groupBy ( p => p . id , p => p . name ) , op . mergeMap ( ( group$ ) => group$ . pipe ( op . reduce ( ( acc , cur ) => [ ... acc , cur ] , [ '' + group$ . key ] ) ) ) , op . map ( ( arr ) => ( { 'id' : parseInt ( arr [ 0 ] , 10 ) , 'values' : arr . slice ( 1 ) } ) ) ) ; return observable$ ; }