배열에 담긴 객체들의 특정 속성 값이 몇 번 등장하는지 세어야 하는 경우가 종종 있습니다. 예를 들어, 여러 과목 데이터에서 동일한 과목명이 몇 번 나타나는지 집계하고 싶다면 자바스크립트의 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을 조합하면 별도의 라이브러리 없이도 배열 내 객체 속성 값의 빈도를 효율적으로 집계할 수 있습니다.