76 lines
3.0 KiB
JavaScript
76 lines
3.0 KiB
JavaScript
|
/** PURE_IMPORTS_START .._operators_groupBy PURE_IMPORTS_END */
|
||
|
import { groupBy as higherOrder, GroupedObservable } from '../operators/groupBy';
|
||
|
export { GroupedObservable };
|
||
|
/* tslint:enable:max-line-length */
|
||
|
/**
|
||
|
* Groups the items emitted by an Observable according to a specified criterion,
|
||
|
* and emits these grouped items as `GroupedObservables`, one
|
||
|
* {@link GroupedObservable} per group.
|
||
|
*
|
||
|
* <img src="./img/groupBy.png" width="100%">
|
||
|
*
|
||
|
* @example <caption>Group objects by id and return as array</caption>
|
||
|
* Observable.of<Obj>({id: 1, name: 'aze1'},
|
||
|
* {id: 2, name: 'sf2'},
|
||
|
* {id: 2, name: 'dg2'},
|
||
|
* {id: 1, name: 'erg1'},
|
||
|
* {id: 1, name: 'df1'},
|
||
|
* {id: 2, name: 'sfqfb2'},
|
||
|
* {id: 3, name: 'qfs3'},
|
||
|
* {id: 2, name: 'qsgqsfg2'}
|
||
|
* )
|
||
|
* .groupBy(p => p.id)
|
||
|
* .flatMap( (group$) => group$.reduce((acc, cur) => [...acc, cur], []))
|
||
|
* .subscribe(p => console.log(p));
|
||
|
*
|
||
|
* // displays:
|
||
|
* // [ { id: 1, name: 'aze1' },
|
||
|
* // { id: 1, name: 'erg1' },
|
||
|
* // { id: 1, name: 'df1' } ]
|
||
|
* //
|
||
|
* // [ { id: 2, name: 'sf2' },
|
||
|
* // { id: 2, name: 'dg2' },
|
||
|
* // { id: 2, name: 'sfqfb2' },
|
||
|
* // { id: 2, name: 'qsgqsfg2' } ]
|
||
|
* //
|
||
|
* // [ { id: 3, name: 'qfs3' } ]
|
||
|
*
|
||
|
* @example <caption>Pivot data on the id field</caption>
|
||
|
* Observable.of<Obj>({id: 1, name: 'aze1'},
|
||
|
* {id: 2, name: 'sf2'},
|
||
|
* {id: 2, name: 'dg2'},
|
||
|
* {id: 1, name: 'erg1'},
|
||
|
* {id: 1, name: 'df1'},
|
||
|
* {id: 2, name: 'sfqfb2'},
|
||
|
* {id: 3, name: 'qfs1'},
|
||
|
* {id: 2, name: 'qsgqsfg2'}
|
||
|
* )
|
||
|
* .groupBy(p => p.id, p => p.name)
|
||
|
* .flatMap( (group$) => group$.reduce((acc, cur) => [...acc, cur], ["" + group$.key]))
|
||
|
* .map(arr => ({'id': parseInt(arr[0]), 'values': arr.slice(1)}))
|
||
|
* .subscribe(p => console.log(p));
|
||
|
*
|
||
|
* // displays:
|
||
|
* // { id: 1, values: [ 'aze1', 'erg1', 'df1' ] }
|
||
|
* // { id: 2, values: [ 'sf2', 'dg2', 'sfqfb2', 'qsgqsfg2' ] }
|
||
|
* // { id: 3, values: [ 'qfs1' ] }
|
||
|
*
|
||
|
* @param {function(value: T): K} keySelector A function that extracts the key
|
||
|
* for each item.
|
||
|
* @param {function(value: T): R} [elementSelector] A function that extracts the
|
||
|
* return element for each item.
|
||
|
* @param {function(grouped: GroupedObservable<K,R>): Observable<any>} [durationSelector]
|
||
|
* A function that returns an Observable to determine how long each group should
|
||
|
* exist.
|
||
|
* @return {Observable<GroupedObservable<K,R>>} An Observable that emits
|
||
|
* GroupedObservables, each of which corresponds to a unique key value and each
|
||
|
* of which emits those items from the source Observable that share that key
|
||
|
* value.
|
||
|
* @method groupBy
|
||
|
* @owner Observable
|
||
|
*/
|
||
|
export function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
|
||
|
return higherOrder(keySelector, elementSelector, durationSelector, subjectSelector)(this);
|
||
|
}
|
||
|
//# sourceMappingURL=groupBy.js.map
|