@terminus/ngx-tools
Version:
[![CircleCI][circle-badge]][circle-link] [![codecov][codecov-badge]][codecov-project] [![semantic-release][semantic-release-badge]][semantic-release] [![MIT License][license-image]][license-url] <br> [![NPM version][npm-version-image]][npm-url] [![Github
35 lines • 3.41 kB
JavaScript
/**
* Return an object containing arrays organized by property
*
* @param array - The array to split
* @param key - The object property to split by
* @returns An object containing arrays separated by property value
*
* @example
* interface MyObj {
* a: string;
* b: number;
* }
* const myArray: MyObj[] = [{a: 'foo', b: 1}, {a: 'bar', b: 6}, {a: 'foo', b: 6}];
* groupBy<MyObj, keyof MyObj>(myArray, 'a');
* Returns:
* {
* foo: [{a: 'foo', b: 1}, {a: 'foo', b: 6}],
* bar: [{a: 'bar', b: 6}],
* }
*/
export function groupBy(array, key) {
const initialValue = {};
return array.reduce((accumulator, x) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const idx = x[key];
// Create an array for the property if one does not exist
if (!accumulator[idx]) {
accumulator[idx] = [];
}
// Add the item to the property array
accumulator[idx].push(x);
return accumulator;
}, initialValue);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtYnkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdGVybWludXMvbmd4LXRvb2xzL3V0aWxpdGllcy8iLCJzb3VyY2VzIjpbImdyb3VwLWJ5L2dyb3VwLWJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBNEMsS0FBVSxFQUFFLEdBQU07SUFDbkYsTUFBTSxZQUFZLEdBQTBCLEVBQUUsQ0FBQztJQUUvQyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsOERBQThEO1FBQzlELE1BQU0sR0FBRyxHQUFXLENBQUMsQ0FBQyxHQUFHLENBQVEsQ0FBQztRQUVsQyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNyQixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO1FBRUQscUNBQXFDO1FBQ3JDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekIsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBhcnJheXMgb3JnYW5pemVkIGJ5IHByb3BlcnR5XG4gKlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIHNwbGl0XG4gKiBAcGFyYW0ga2V5IC0gVGhlIG9iamVjdCBwcm9wZXJ0eSB0byBzcGxpdCBieVxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYXJyYXlzIHNlcGFyYXRlZCBieSBwcm9wZXJ0eSB2YWx1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBpbnRlcmZhY2UgTXlPYmoge1xuICogICBhOiBzdHJpbmc7XG4gKiAgIGI6IG51bWJlcjtcbiAqIH1cbiAqIGNvbnN0IG15QXJyYXk6IE15T2JqW10gPSBbe2E6ICdmb28nLCBiOiAxfSwge2E6ICdiYXInLCBiOiA2fSwge2E6ICdmb28nLCBiOiA2fV07XG4gKiBncm91cEJ5PE15T2JqLCBrZXlvZiBNeU9iaj4obXlBcnJheSwgJ2EnKTtcbiAqIFJldHVybnM6XG4gKiAgIHtcbiAqICAgICBmb286IFt7YTogJ2ZvbycsIGI6IDF9LCB7YTogJ2ZvbycsIGI6IDZ9XSxcbiAqICAgICBiYXI6IFt7YTogJ2JhcicsIGI6IDZ9XSxcbiAqICAgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeTxULCBLIGV4dGVuZHMoa2V5b2YgVCAmIChudW1iZXIgfCBzdHJpbmcpKT4oYXJyYXk6IFRbXSwga2V5OiBLKTogeyBbaWQ6IHN0cmluZ106IFRbXSB9IHtcbiAgY29uc3QgaW5pdGlhbFZhbHVlOiB7IFtpZDogc3RyaW5nXTogVFtdIH0gPSB7fTtcblxuICByZXR1cm4gYXJyYXkucmVkdWNlKChhY2N1bXVsYXRvciwgeCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgaWR4OiBzdHJpbmcgPSB4W2tleV0gYXMgYW55O1xuXG4gICAgLy8gQ3JlYXRlIGFuIGFycmF5IGZvciB0aGUgcHJvcGVydHkgaWYgb25lIGRvZXMgbm90IGV4aXN0XG4gICAgaWYgKCFhY2N1bXVsYXRvcltpZHhdKSB7XG4gICAgICBhY2N1bXVsYXRvcltpZHhdID0gW107XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBpdGVtIHRvIHRoZSBwcm9wZXJ0eSBhcnJheVxuICAgIGFjY3VtdWxhdG9yW2lkeF0ucHVzaCh4KTtcblxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfSwgaW5pdGlhbFZhbHVlKTtcbn1cbiJdfQ==