Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 배열에서 숫자만 골라 합계 구하기

문제 정의

배열을 인수로 받아 처리하는 JavaScript 함수를 작성해야 합니다. 이 배열에는 숫자 리터럴, 문자열 리터럴, 객체, undefined 등 어떤 타입의 값이든 섞여 있을 수 있습니다.

함수는 배열 안에서 숫자(Number) 타입의 값만 골라내어 그 합계를 반환해야 합니다.

예제 코드

const arr = [1, 2, 'a', 4];
const countNumbers = (arr = []) => {
    let sum = 0;
    for(let i = 0; i < arr.length; i++){
        const el = arr[i];
        if(+el){
            sum += +el;
        };
    };
    return sum;
}
console.log(countNumbers(arr));

출력 결과

콘솔에 출력되는 결과는 다음과 같습니다.

7

코드 설명

위 코드의 핵심은 단항 덧셈 연산자(+)입니다. 단항 덧셈 연산자는 피연산자를 숫자로 변환하며, 변환에 실패하면 NaN을 반환합니다. NaN은 조건문에서 거짓(falsy)으로 평가되기 때문에, if(+el) 조건을 통해 숫자로 변환 가능한 요소만 걸러낼 수 있습니다.

따라서 위 예제에서는 숫자인 1, 2, 4만 더해져 결과값 7이 반환됩니다.

filter와 reduce를 활용한 대안

모던 자바스크립트 문법을 선호한다면 filterreduce 메서드를 조합해 같은 로직을 더 간결하게 표현할 수도 있습니다.

const countNumbers = (arr = []) =>
  arr.filter(el => typeof el === 'number')
     .reduce((acc, cur) => acc + cur, 0);

console.log(countNumbers([1, 2, 'a', 4])); // 7

이 방식은 typeof 검사를 통해 진짜 숫자 타입만 정확히 필터링하므로, 의도하지 않은 형 변환으로 인한 부작용을 줄일 수 있다는 장점이 있습니다.