export function groupBy(items: T[], keyGetter: (t: T) => string): Map { const map = new Map(); if (items) { items.forEach((item) => { const key = keyGetter(item); let collection: T[] = map.get(key); if (!collection) { collection = new Array(); map.set(key, collection); } collection.push(item); }); } return map; } export function filter( items: T[], searchString: string, fieldsGetter: (t: T) => string | string[] ): T[] { return searchString ? items.filter((item) => { const tempFields = fieldsGetter(item); const fields = (typeof tempFields === 'string' ? [tempFields] : tempFields ) .filter((t) => !!t) .map((t) => t.toLowerCase()); return fields.filter((t) => t.indexOf(searchString) !== -1).length > 0; }) : [...items]; }