JangBaGeum.gif

[TypeScript] 제네릭을 이용한 객체 배열 Group by 본문

ETC/알고리즘 & 문법

[TypeScript] 제네릭을 이용한 객체 배열 Group by

장바금 2022. 11. 24. 17:12

 제네릭을 이용한 Group by 

const groupBy = <T, K extends keyof T>(array: T[], key: K) => {
	let map = new Map<T[K], T[]>();
	array.forEach(item => {
		let itemKey = item[key];
		if (!map.has(itemKey)) {
			map.set(itemKey, array.filter(i => i[key] === item[key]));
		}
	});
	return map;
}

위 함수는 제네릭 T의 배열과 T의 key로 소속되어있는 K를 인자로 받는다.

 

array를 순회하며 Map에 Key가 존재하는지 확인 후, 없다면 키를 생성하고 배열 내에 동일한 키를 가진 항목을 Map에 추가한다.

const items = [
    {type: "dog", name: "fred"},
    {type: "cat", name: "milo"},
    {type: "dog", name: "otis"},
    {type: "duck", name: "barry"},
];
const grouped = groupBy(items, "type");

console.log(grouped);

/* OUTPUT:
{
    {
        key: "dog",
     	value: [
	        {type: "dog", name: "fred"},
        	{type: "dog", name: "otis"},
    	]
    },
    {
        key: "cat": 
        value: [
        	{type: "cat", name: "milo"},
    	]
    },
    {
    	key: "duck",
         value: [
	        {type: "duck", name: "barry"},
    	]
    }
}
*/

 

반환 값의 Type은 Map이기에 iterable object 반환할 수 있어 forEach 등을 사용해 순회가 가능하다.

grouped.forEach((items, key) => {
   console.log(key, items); 
});