Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 배열을 받아 데이터 타입별로 분류된 Map 객체를 반환하는 함수 작성하기

혼합된 데이터 타입을 가진 배열을 입력받아, 각 요소를 데이터 타입별로 그룹화한 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을 조합하면 별도의 조건문 분기 없이도 깔끔하게 데이터를 타입별로 분류할 수 있습니다. 참고로 nulltypeof 결과가 'object'로 반환되고, 함수는 'function'으로 분류된다는 점도 함께 알아두면 좋습니다.