JavaScript에서 다차원(중첩) 배열에 includes() 메서드를 그대로 사용하면 의도한 대로 동작하지 않는다는 것은 잘 알려진 고질적인 문제입니다. Array.prototype.flat() 함수로 배열을 먼저 평탄화(flatten)한 뒤 검색하는 방법도 있지만, 아직까지는 브라우저 지원 상태가 완벽하지 않은 편입니다.
문제 정의
그래서 우리의 과제는 배열과 문자열을 인자로 받아, 해당 문자열이 배열 안에 존재하는지 여부에 따라 불리언(Boolean) 값을 반환하는 includesMultiDimension() 함수를 만드는 것입니다.
이 문제에는 수많은 해결 방법이 존재합니다. 대부분 재귀(recursion), 무거운 배열 함수, 반복문 등을 활용한 방식들입니다.
하지만 이번 글에서 소개할 방법은 중첩 배열 속 문자열의 존재 여부를 확인하는 방법 중 단연코 가장 간단한 방식입니다.
예제 코드
const names = ['Ram', 'Shyam', 'Laxman', [
'Jay', 'Jessica', [
'Vikram'
]
]];
const includesMultiDimension = (arr, str) =>
JSON.stringify(arr).includes(str);
console.log(includesMultiDimension(names, 'Vikram'));
동작 원리
이 한 줄짜리 솔루션의 핵심은 배열 전체를 JSON 문자열로 변환하는 것입니다. 배열이 하나의 문자열이 되면 그 위에 곧바로 includes()를 적용해 검색할 수 있기 때문입니다. 복잡한 재귀 호출이나 추가 라이브러리 없이도 깊은 중첩 구조까지 한 번에 처리할 수 있다는 점이 큰 장점입니다.
주의할 점
다만 이 방식은 부분 문자열(substring) 기준으로 판별하기 때문에, 예를 들어 배열에 'Ramesh'가 있는 상태에서 'Ram'을 검색하면 true가 반환될 수 있습니다. 요소 단위의 정확한 일치가 필요하다면 flat()이나 재귀 탐색 방식을 함께 고려하는 것이 좋습니다.
출력 결과
콘솔 출력 결과는 다음과 같습니다.
true