[RECIPE]: array flatten and distinct in TS
I caught up myself on a thought that I have looked to a way to flatten array in TS several times this year. Probably, I had bad memory and cannot remember this easily. But maybe, it's more because this is not something you do everyday. So, let's keep the recipe here
Use case: you have array of arrays of similar elements, which you want to flatten. As simple as that:
const data: ItemType[] = [{id: 1, items: [...]}, {id: 2, items: [...]}];
const flattenElements: ItemType[] = ([] as ItemType[]).concat(
...data.map(x => x.items),
);
The key thing - usage of concat function. But with couple of tricks:
- Concat function is not type safe (or better to say, [] doesn't have type), so use `as` keyword with your type for initial value: `[] as ItemType[]`
- Inside concat callback it is necessary to use `...` operator, so that your array will be re-build and concat can work with all items. Otherwise - concat will simply push your array as another single element of result array
Keep calm and do smart things!