{"id":3796,"date":"2020-06-30T13:16:47","date_gmt":"2020-06-30T12:16:47","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=3796"},"modified":"2020-06-30T13:16:47","modified_gmt":"2020-06-30T12:16:47","slug":"typescript-groupby","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/typescript-groupby\/","title":{"rendered":"Typescript groupBy"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">interface IGroup&lt;U> {\n    group: string;\n    data: U;\n}\n\nexport function groupBy&lt;T, U>(array: T[], fn: (item: T) => IGroup&lt;U>) {\n    const groups: { [key: string]: U[] } = {};\n    array.forEach((item) => {\n        const result = fn(item);\n        const group = JSON.stringify(result.group);\n        groups[group] = groups[group] || [];\n        groups[group].push(result.data);\n    });\n    return Object.keys(groups).map((group) => groups[group]);\n};\n\n\/\/ usage example:\nexport interface IArticleLine {\n    id: string;\n    articleNumber: number;\n    articleName: string;\n    amount: number;\n    amountUnit: string;\n    deliveryAmount: number;\n    deliveryAmountUnit: string;\n}\n\ngetArticleLines(articleLines: IArticleLine[]) {\n\treturn groupBy(articleLines, (item) => ({ group: `${item.articleNumber}-${item.amountUnit}-${item.deliveryAmountUnit}`, data: item }))\n\t\t.map((group) => {\n\t\t\tconst article = group[0];\n\t\t\tarticle.amount = group.reduce((_, c) => _ + c.amount || 0, 0);\n\t\t\tarticle.deliveryAmount = group.reduce((_, c) => _ + c.deliveryAmount || 0, 0);\n\t\t\treturn article;\n\t\t})\n\t\t.map((article, i) => {\n\t\t\treturn &lt;div className=\"article-row\" key={i}>\n\t\t\t\t&lt;div>{article.articleName}&lt;\/div>\n\t\t\t\t&lt;div>&lt;\/div>\n\t\t\t\t&lt;div>{`${article.amount} ${article.amountUnit}`}&lt;\/div>\n\t\t\t\t&lt;div>{`${article.deliveryAmount} ${article.deliveryAmountUnit}`}&lt;\/div>\n\t\t\t&lt;\/div>;\n\t\t});\n}\n<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3796","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/3796","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=3796"}],"version-history":[{"count":1,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/3796\/revisions"}],"predecessor-version":[{"id":3797,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/3796\/revisions\/3797"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=3796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=3796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=3796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}