interface IGroup<U> { group: string; data: U; } export function groupBy<T, U>(array: T[], fn: (item: T) => IGroup<U>) { const groups: { [key: string]: U[] } = {}; array.forEach((item) => { const result = fn(item); const group = JSON.stringify(result.group); groups[group] = groups[group] || []; groups[group].push(result.data); }); return Object.keys(groups).map((group) => groups[group]); }; // usage example: export interface IArticleLine { id: string; articleNumber: number; articleName: string; amount: number; amountUnit: string; deliveryAmount: number; deliveryAmountUnit: string; } getArticleLines(articleLines: IArticleLine[]) { return groupBy(articleLines, (item) => ({ group: `${item.articleNumber}-${item.amountUnit}-${item.deliveryAmountUnit}`, data: item })) .map((group) => { const article = group[0]; article.amount = group.reduce((_, c) => _ + c.amount || 0, 0); article.deliveryAmount = group.reduce((_, c) => _ + c.deliveryAmount || 0, 0); return article; }) .map((article, i) => { return <div className="article-row" key={i}> <div>{article.articleName}</div> <div></div> <div>{`${article.amount} ${article.amountUnit}`}</div> <div>{`${article.deliveryAmount} ${article.deliveryAmountUnit}`}</div> </div>; }); }
379600cookie-checkTypescript groupBy