JavaScript에서 배열 데이터의 평균을 구할 때, 유효하지 않은 값(null)은 제외해야 하는 경우가 자주 있습니다. 예를 들어 다음과 같이 객체로 이루어진 배열이 있다고 가정해 보겠습니다.
data = [
{"Age":26,"Level":8},
{"Age":37,"Level":9},
{"Age":32,"Level":5},
{"Age":31,"Level":11},
{"Age":null,"Level":15},
{"Age":null,"Level":17},
{"Age":null,"Level":45}
];여기서 요구 사항은 Age 속성에 유효한(truthy) 값이 있는 객체들만 대상으로 Level의 평균을 계산하는 JavaScript 함수를 작성하는 것입니다. Age가 null인 객체는 평균 계산에서 완전히 제외되어야 합니다.
구현 방법
이 문제는 reduce() 메서드를 활용하면 깔끔하게 해결할 수 있습니다. reduce를 사용해 유효한 데이터의 개수(count)와 레벨의 합계(sum)를 동시에 누적한 뒤, 마지막에 합계를 개수로 나누면 됩니다.
예제 코드
data = [
{"Age":26,"Level":8},
{"Age":37,"Level":9},
{"Age":32,"Level":5},
{"Age":31,"Level":11},
{"Age":null,"Level":15},
{"Age":null,"Level":17},
{"Age":null,"Level":45}
];
const findAverage = arr => {
const creds = arr.reduce((acc, val) => {
const { Age, Level } = val;
let { count, sum } = acc;
if(Age){
count += 1;
sum += Level;
};
return { count, sum };
}, {
count: 0,
sum: 0
});
return (creds.sum)/(creds.count);
};
console.log(findAverage(data));코드 설명
reduce()의 초기값으로{ count: 0, sum: 0 }을 설정하여 누적 계산의 기준점을 만듭니다.- 각 객체를 순회하면서
if(Age)조건문으로 Age 값이 null이 아닌 경우(유효한 값인 경우)에만 count와 sum을 증가시킵니다. - 최종적으로
sum / count를 반환하여 유효한 데이터만 반영한 평균값을 얻습니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
8.25
Age가 null인 세 개의 객체(Level: 15, 17, 45)는 계산에서 제외되었기 때문에, 유효한 네 개의 객체(Level: 8, 9, 5, 11)만으로 평균을 구한 결과인 8.25가 출력됩니다. 만약 null 값을 제외하지 않고 전체 합계를 7로 나누었다면 완전히 다른 결과가 나왔을 것이므로, 실무에서 데이터 집계 시 이러한 필터링 처리는 매우 중요합니다.