js 递归树结构,根据子节点获取父节点
于2023-08-12 22:00:29发布
33
原文地址: https://blog.csdn.net/weixin_45042868/article/details/123747209
遍历数组,根据子节点查询父节点中的各个层
需求
目前只知道【节点6】,想要知道【节点6】在哪棵树上
预期结果:返回一个层级数组
[2, 6]
实际情况:找到结果,并正确打断跳出
源码
// 数据源
const dataSource = [
{
id: 1,
label: 'Level one 1',
children: [
{
id: 4,
label: 'Level two 1-1',
children: [
{
id: 9,
label: 'Level three 1-1-1'
},
{
id: 10,
label: 'Level three 1-1-2'
}
]
}
]
},
{
id: 2,
label: 'Level one 2',
children: [
{
id: 5,
label: 'Level two 2-1'
},
{
id: 6,
label: 'Level two 2-2'
}
]
},
{
id: 3,
label: 'Level one 3',
children: [
{
id: 7,
label: 'Level two 3-1'
},
{
id: 8,
label: 'Level two 3-2'
}
]
}
]
// 查找父节点
function findP(id, list = [], result = []) {
for (let i = 0; i < list.length; i += 1) {
console.log('*******', list[i].id, '********')
const item = list[i]
// 找到目标
if (item.id === id) {
console.log('找到了')
// 加入到结果中
result.push(item.id)
// 因为可能在第一层就找到了结果,直接返回当前结果
if (result.length === 1) return result
return true
}
// 如果存在下级节点,则继续遍历
if (item.children) {
// 预设本次是需要的节点并加入到最终结果result中
result.push(item.id)
const find = findP(id, item.children, result)
// 如果不是false则表示找到了,直接return,结束递归
if (find) {
return result
}
// 到这里,意味着本次并不是需要的节点,则在result中移除
result.pop()
}
}
// 如果都走到这儿了,也就是本轮遍历children没找到,将此次标记为false
return false
}
console.log('最终:', findP(6, dataSource))