다음과 같이 객체 여러 개를 담고 있는 배열이 있다고 가정해 보겠습니다.
const arr = [
{val: 56, canUse: true},
{val: 16, canUse: true},
{val: 45, canUse: true},
{val: 76, canUse: false},
{val: 45, canUse: true},
{val: 23, canUse: false},
{val: 23, canUse: false},
{val: 87, canUse: true},
];이때 우리가 작성해야 할 함수는 canUse 플래그가 true로 설정된 객체들만 골라내어, 해당 객체들의 val 속성 값 평균을 계산하는 JavaScript 함수입니다. canUse가 false인 객체는 계산에서 완전히 제외되어야 합니다.
예제 코드
아래는 위 요구사항을 구현한 전체 코드입니다.
const arr = [
{val: 56, canUse: true},
{val: 16, canUse: true},
{val: 45, canUse: true},
{val: 76, canUse: false},
{val: 45, canUse: true},
{val: 23, canUse: false},
{val: 23, canUse: false},
{val: 87, canUse: true},
];
const excludedAverage = arr => {
let count = 0, props = 0;
for(let i = 0; i < arr.length; i++){
if(!arr[i].canUse){
continue;
};
props++;
count += arr[i].val;
};
return (count) / (!props ? 1 : props);
};
console.log(excludedAverage(arr));출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
49.8
코드 동작 원리
- for 반복문으로 배열을 순회하면서
canUse가 false인 객체는continue를 통해 건너뜁니다. - canUse가 true인 객체의 경우
val값을 누적하고(count), 유효한 객체의 개수를 세어(props) 둡니다. - 마지막에는 총합을 개수로 나누어 평균을 반환합니다. 이때 삼항 연산자를 사용해 개수가 0일 때 0으로 나누는 오류(Infinity 발생)를 방지합니다.
filter와 reduce를 활용한 대안
같은 로직을 filter()와 reduce() 메서드를 사용하면 더 간결하게 표현할 수도 있습니다.
const excludedAverage = arr => {
const usable = arr.filter(item => item.canUse);
if(!usable.length) return 0;
return usable.reduce((sum, item) => sum + item.val, 0) / usable.length;
};
console.log(excludedAverage(arr)); // 49.8두 방식 모두 동일한 결과를 반환하지만, filter와 reduce를 활용한 방식은 의도가 더 명확하게 드러나 가독성 면에서 유리합니다. 상황과 코드 스타일에 맞게 선택하여 사용하시면 됩니다.