문제 개요
리터럴 값으로 구성된 중첩 배열을 인자로 받아, 배열 안에 있는 모든 값을 순서대로 연결해 하나의 문자열로 변환하는 JavaScript 함수를 작성해야 합니다.
예를 들어 다음과 같은 중첩 배열이 있다고 가정해 보겠습니다.
const arr = [
'hello', [
'world', 'how', [
'are', 'you', [
'without', 'me'
]
]
]
];재귀 함수를 활용한 해결 방법
배열의 중첩 깊이가 정해져 있지 않기 때문에, 재귀(Recursion)를 활용하는 것이 가장 효과적입니다. 배열의 각 요소를 순회하면서 해당 요소가 배열인지 판별하고, 배열이라면 함수를 다시 호출하고, 그렇지 않다면 결과 문자열에 그대로 이어 붙이는 방식입니다.
예제 코드
const arrayToString = (arr) => {
let str = '';
for(let i = 0; i < arr.length; i++){
if(Array.isArray(arr[i])){
str += arrayToString(arr[i]);
}else{
str += arr[i];
}
}
return str;
};
console.log(arrayToString(arr));코드 동작 원리
- Array.isArray(): 전달된 값이 배열인지 여부를 확인하는 내장 메서드입니다.
- 요소가 배열이면
arrayToString함수를 재귀적으로 호출해 내부 배열의 값들을 먼저 문자열로 만듭니다. - 요소가 일반 값(문자열 등)이라면 별도 처리 없이 결과 문자열에 바로 연결합니다.
- 모든 순회가 끝나면 완성된 문자열을 반환합니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
helloworldhowareyouwithoutme
대안: flat() 메서드 활용
ES2019부터 지원되는 Array.prototype.flat() 메서드를 사용하면 더 간결하게 처리할 수 있습니다. 인자로 Infinity를 전달하면 모든 중첩 단계가 평탄화됩니다.
const result = arr.flat(Infinity).join('');
console.log(result); // helloworldhowareyouwithoutme이처럼 재귀 호출이나 flat(Infinity)를 활용하면 중첩 깊이와 관계없이 임의의 중첩 배열도 손쉽게 하나의 문자열로 변환할 수 있습니다.