이번 글에서는 숫자로 이루어진 배열을 인자로 받아, 가장 작은 값과 가장 큰 값을 제외한 나머지 요소들의 평균을 반환하는 자바스크립트 함수를 작성해 보겠습니다.
접근 방법
배열을 여러 번 순회하는 대신 reduce() 메서드를 활용하면 단 한 번의 순회로 다음 세 가지 값을 동시에 계산할 수 있습니다.
- sum: 배열 요소들의 총합
- max: 배열 내 최댓값
- min: 배열 내 최솟값
순회가 끝난 뒤 총합에서 최댓값과 최솟값을 차례로 빼고, 그 결과를 (배열 길이 − 2)로 나누면 원하는 평균을 얻을 수 있습니다.
예제 코드
const arr = [5, 3, 5, 6, 12, 5, 65, 3, 2];
const findExcludedAverage = arr => {
const creds = arr.reduce((acc, val) => {
let { min, max, sum } = acc;
sum += val;
if (val > max) {
max = val;
}
if (val < min) {
min = val;
}
return { min, max, sum };
}, {
min: Infinity,
max: -Infinity,
sum: 0
});
const { max, min, sum } = creds;
return (sum - min - max) / (arr.length - 2);
};
console.log(findExcludedAverage(arr));
코드 설명
- 초기 누적 객체를
{ min: Infinity, max: -Infinity, sum: 0 }으로 설정하면, 어떤 값과 비교해도 첫 번째 요소가 곧바로 최댓값·최솟값으로 갱신됩니다. - 순회 중에는 각 요소를
sum에 더하고, 현재 값이 기존 최댓값보다 크거나 최솟값보다 작으면 해당 값을 갱신합니다. - 마지막에는
(sum - min - max)로 극단값 두 개를 제외한 합계를 구한 후, 남은 요소 개수인(arr.length - 2)로 나누어 평균을 반환합니다.
출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
5.571428571428571