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 getParentNodeId(tree, childId) {
// 遍历树节点
for (let node of tree) {
// 如果当前节点就是目标节点的父节点,直接返回当前节点id
if (node.children && node.children.some(child => child.id === childId)) {
return node.id;
}
// 否则继续遍历当前节点的子节点
if (node.children) {
const parentId = getParentNodeId(node.children, childId);
if (parentId !== null) {
return parentId;
}
}
}
// 如果没有找到父节点,则返回null
return null;
}
// 示例使用
console.log(getParentNodeId(dataSource, 9)); // 输出 4
console.log(getParentNodeId(dataSource, 6)); // 输出 2
console.log(getParentNodeId(dataSource, 3)); // 输出 null
在上面的代码中,tree
参数是一个包含树所有节点的数组,每个节点包含id
和children
属性,id
是节点的唯一标识,children
是一个包含子节点的数组,每个子节点包含id
和label
属性。childId
参数是需要查找其父节点id的目标节点id。
首先遍历整个树,如果当前节点的children
属性包含目标节点的id
,说明当前节点就是目标节点的父节点,直接返回当前节点的id
。否则,继续遍历当前节点的子节点,如果找到目标节点的父节点,则返回其id
,否则继续遍历下一个节点。如果最终没有找到父节点,则返回null
。在这个例子中,使用了数组的some
方法来查找节点的子节点中是否包含指定的子节点id。