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

JavaScript reduce()로 배열 내 객체 속성 값의 등장 횟수 구하기

배열에 담긴 객체들의 특정 속성 값이 몇 번 등장하는지 세어야 하는 경우가 종종 있습니다. 예를 들어, 여러 과목 데이터에서 동일한 과목명이 몇 번 나타나는지 집계하고 싶다면 자바스크립트의 reduce() 메서드와 Map 객체를 활용하면 깔끔하게 해결할 수 있습니다.

동작 원리

reduce() 메서드는 배열의 각 요소를 순회하면서 하나의 누적 결과값을 만들어냅니다. 여기서는 누적값으로 Map 객체를 사용합니다. 순회 중인 객체의 subjectName이 Map에 이미 존재하면 해당 항목의 frequency 값을 1 증가시키고, 존재하지 않으면 새로운 항목을 추가합니다. 마지막으로 Map의 values()를 통해 값들만 추출한 뒤 전개 연산자(...)로 배열로 변환하면 됩니다.

예제 코드

const subjectDetails =
[
    {
        subjectId: '101',
        subjectName: 'JavaScript'
    },
    {
        subjectId: '102',
        subjectName: 'Java'
    },
    {
        subjectId: '103',
        subjectName: 'JavaScript'
    }
];
console.log([...subjectDetails.reduce((obj1, obj2) => {
    if (obj1.has(obj2.subjectName)){
        obj1.get(obj2.subjectName).frequency++;
    } else {
        obj1.set(obj2.subjectName, { subjectName: obj2.subjectName,
        frequency: 1 });
    }
    return obj1;
}, new Map()).values()]);

실행 방법

위 프로그램을 실행하려면 Node.js 환경에서 다음 명령어를 사용합니다. 파일 이름은 본인이 저장한 파일명으로 지정하면 됩니다.

node fileName.js

여기서는 파일 이름이 demo144.js라고 가정하겠습니다.

실행 결과

위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.

PS C:\Users\Amit\JavaScript-code> node demo144.js
[
    { subjectName: 'JavaScript', frequency: 2 },
    { subjectName: 'Java', frequency: 1 }
]

출력 결과를 보면 'JavaScript'는 2번, 'Java'는 1번 등장했음을 알 수 있습니다. 이처럼 reduce()와 Map을 조합하면 별도의 라이브러리 없이도 배열 내 객체 속성 값의 빈도를 효율적으로 집계할 수 있습니다.