혼합된 데이터 타입을 가진 배열을 입력받아, 각 요소를 데이터 타입별로 그룹화한 Map() 객체를 반환하는 classifyArray() 함수를 작성해야 한다고 가정해 보겠습니다.
동작 예시
예를 들어 다음과 같은 배열이 입력으로 주어졌을 때:
// 입력 배열:
const arr = ['class', 2, [7, 8, 9], {"name": "Michael"}, Symbol('foo'),
true, false, 'name', 6];
// 기대되는 출력 Map:
Map(5) {
'string' => [ 'class', 'name' ],
'number' => [ 2, 6 ],
'object' => [ [ 7, 8, 9 ], { name: 'Michael' } ],
'symbol' => [ Symbol(foo) ],
'boolean' => [ true, false ]
}구현 코드
이 함수는 reduce() 메서드와 typeof 연산자를 활용하면 간단하게 구현할 수 있습니다. 각 요소의 타입을 키로 사용하고, 같은 타입의 요소들을 하나의 배열로 묶어 Map에 저장하는 방식입니다.
const arr = ['class', 2, [7, 8, 9], {"name": "Michael"}, Symbol('foo'),
true, false, 'name', 6];
const classifyArray = arr => {
return arr.reduce((acc, val) => {
const previousData = acc.get(typeof val);
if(previousData){
acc.set(typeof val, [...previousData, val]);
}else{
acc.set(typeof val, [val]);
};
return acc;
}, new Map());
};
console.log(classifyArray(arr));코드 설명
- reduce(): 초기값으로 빈
new Map()을 설정하고, 배열의 각 요소를 순회하며 누적 처리합니다. - typeof val: 현재 요소의 데이터 타입(문자열)을 구합니다. 이 값이 Map의 키가 됩니다.
- acc.get(typeof val): 해당 타입의 키가 이미 존재하는지 확인합니다.
- 키가 존재하면 기존 배열에 새 요소를 추가하고(
[...previousData, val]), 존재하지 않으면 새로운 배열을 생성하여 저장합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다:
Map(5) {
'string' => [ 'class', 'name' ],
'number' => [ 2, 6 ],
'object' => [ [ 7, 8, 9 ], { name: 'Michael' } ],
'symbol' => [ Symbol(foo) ],
'boolean' => [ true, false ]
}이처럼 reduce()와 Map을 조합하면 별도의 조건문 분기 없이도 깔끔하게 데이터를 타입별로 분류할 수 있습니다. 참고로 null은 typeof 결과가 'object'로 반환되고, 함수는 'function'으로 분류된다는 점도 함께 알아두면 좋습니다.