자바스크립트 개발을 하다 보면 배열 안에 또 다른 배열이 중첩된 형태의 데이터를 자주 만나게 됩니다. 이번 글에서는 중첩 배열에 포함된 모든 숫자의 합계를 구하는 함수를 작성해 보겠습니다.
여기서 한 가지 조건이 있습니다. 바로 Array.prototype.flat() 메서드를 사용하지 않고 문제를 해결해야 한다는 점입니다. 대신 재귀 함수(Recursion)를 활용하면 깔끔하게 처리할 수 있습니다.
재귀를 활용한 풀이 접근 방식
핵심 아이디어는 간단합니다. 배열의 각 요소를 하나씩 순회하면서, 해당 요소가 배열인지 확인하고,
- 요소가 배열이라면 → 같은 함수를 다시 호출(재귀)하여 내부 합계를 구합니다.
- 요소가 숫자라면 → 그대로 합계에 더합니다.
이 로직은 Array.isArray() 메서드를 사용하면 손쉽게 구현할 수 있습니다.
예제 코드
const arr = [
5,
7,
[ 4, [2], 8, [1,3], 2 ],
[ 9, [] ],
1,
8
];
const findNestedSum = (arr) => {
let sum = 0;
for(let len = 0; len < arr.length; len++){
sum += Array.isArray(arr[len]) ? findNestedSum(arr[len]) :
arr[len];
};
return sum;
};
console.log(findNestedSum(arr));코드 설명
findNestedSum함수는 매개변수로 받은 배열을 처음부터 끝까지 반복문으로 순회합니다.- 각 요소에 대해
Array.isArray()로 배열 여부를 판별합니다. - 배열이라면 자기 자신을 다시 호출해 그 하위 배열의 합계를 반환받고, 숫자라면 값을 그대로 누적합니다.
- 빈 배열(
[])이 있더라도 반복문이 실행되지 않아 0을 반환하므로 오류 없이 처리됩니다.
실행 결과
위 코드를 콘솔에서 실행하면 다음과 같은 결과가 출력됩니다.
50
모든 중첩 깊이의 숫자(5 + 7 + 4 + 2 + 8 + 1 + 3 + 2 + 9 + 1 + 8)가 정확히 더해져 50이 출력되는 것을 확인할 수 있습니다.
마무리
이처럼 재귀 함수와 Array.isArray()만 활용하면 flat() 없이도 임의의 깊이를 가진 중첩 배열의 합계를 손쉽게 구할 수 있습니다. 같은 원리를 응용하면 평균 계산, 최댓값·최솟값 찾기 등 다양한 중첩 배열 연산에도 적용할 수 있으니 꼭 기억해 두시길 바랍니다.