const treeData = [
{
title: 'A',
fullPath: '/',
children: [
{
title: 'a',
fullPath: '/A',
children: [
{ title: 'aa', fullPath: '/A/a', children: [] },
{ title: 'bb', fullPath: '/A/a', children: [] },
{ title: 'cc', fullPath: '/A/a', children: [] },
],
},
{ title: 'b', fullPath: '/A', children: [] },
{ title: 'c', fullPath: '/A', children: [] },
],
},
{
title: 'B',
fullPath: '/',
children: [
{
title: 'a',
fullPath: '/B',
children: [{ title: 'aa', fullPath: '/B/a', children: [] }],
},
],
},
{
title: 'C',
fullPath: '/',
children: [
{ title: 'a', fullPath: '/C', children: [] },
{
title: 'b',
fullPath: '/C',
children: [
{ title: 'aa', fullPath: '/C/b', children: [] },
{ title: 'bb', fullPath: '/C/b', children: [] },
{
title: 'cc',
fullPath: '/C/b',
children: [
{
title: 'aaa',
fullPath: '/C/b/cc',
children: [],
},
],
},
],
},
],
},
];
🔹 원하는 결과
(밑에서 동작 과정 자세히 설명 😊)
findChildrenByPath(treeData, '/A/a');
// 예상 출력: [{ title: 'aa', fullPath: '/A/a', children: [] }, ...]
🔹 코드
const findChildrenByPath = (tree, path) => {
for (const node of tree) {
if (node.fullPath === path) {
return node.children;
}
if (node.children.length > 0) {
const result = findChildrenByPath(node.children, path);
if (result !== null) return result;
}
}
return null; // Path not found
};
🔹 동작 흐름
for
루프: 각 노드를 하나씩 탐색if
문으로 fullPath
가 path
와 같은지 확인node
가 찾고자 하는 path
를 가지고 있는지 확인하는 단계node
의 fullPath
가 path
와 일치하면, 찾고자 하는 경로에 도달 ➡ node.children
을 반환node
가 원하는 경로가 아닐 경우, node.children
이 있는지 확인children
이 있는 경우만 재귀 호출path
를 찾는다null
이 아니라면, 찾은 children
배열을 반환path
를 찾지 못하면 null
을 반환🔹 예시와 함수의 동작 과정
findChildrenByPath(treeData, '/A/a')
루트 트리에서 첫 번째 node
인 "A"
를 확인 (fullPath: '/')
/A/a
와 다르기 때문에, "A"
의 children
으로 이동
"A"
의 children
에서 "a"
를 확인 (fullPath: '/A')
/A/a
와 다르므로 "a"
의 children
으로 이동
"a"
의 children
에서 node
들 중 첫 번째인 "aa"
의 fullPath
가 /A/a
와 일치
children
을 반환
결과
[
{ title: 'aa', fullPath: '/A/a', children: [] },
{ title: 'bb', fullPath: '/A/a', children: [] },
{ title: 'cc', fullPath: '/A/a', children: [] }
]