다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.
const arr = [3, 5, 5, 2, 23, 4, 7, 8, 8, 9];
우리가 작성해야 할 함수는 이 배열과 하나의 숫자 n을 입력받아, 배열의 요소 중 n보다 큰 값과 작은 값이 각각 몇 개인지 나타내는 객체를 반환하는 것입니다.
배열을 한 번만 순회하면서 두 가지 카운트를 동시에 구할 수 있도록 reduce() 메서드를 활용해 보겠습니다. 초기값으로 greater(큰 수의 개수)와 smaller(작은 수의 개수)를 0으로 설정하고, 각 요소를 비교하며 카운트를 누적하는 방식입니다.
예제
코드는 다음과 같습니다.
const arr = [3, 5, 5, 2, 23, 4, 7, 8, 8, 9];
const smallerLargerNumbers = (arr, num) => {
return arr.reduce((acc, val) => {
let { greater, smaller } = acc;
if(val > num){
greater++;
};
if(val < num){
smaller++;
};
return { greater, smaller };
}, {
greater: 0,
smaller: 0
});
};
console.log(smallerLargerNumbers(arr, 3));
위 코드에서 주목할 점은, num과 정확히 일치하는 값은 어느 쪽 카운트에도 포함되지 않는다는 것입니다. 예제에서 기준값이 3이므로 배열의 첫 번째 요소인 3은 제외됩니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
{ greater: 8, smaller: 1 }즉, 배열 전체 10개 요소 중 기준값 3보다 큰 수는 8개, 작은 수는 1개라는 의미입니다. 이처럼 reduce()를 사용하면 별도의 반복문 없이도 깔끔하게 집계 로직을 구현할 수 있습니다.