为了实现从末节点回溯至根节点并拼接 label
的功能,你可以使用递归函数来遍历树结构。以下是一个可能的实现方式:
function findPathByValue(tree, targetValue, path = []) {
// 遍历当前节点的所有子节点
for (let node of tree) {
// 将当前节点的label添加到路径中
path.push(node.label);
// 如果当前节点的value等于目标值,则返回从根到当前节点的路径
if (node.value === targetValue) {
return path.reverse().join('/'); // 反转并拼接成字符串
}
// 如果当前节点有子节点,则递归查找
if (node.children && node.children.length > 0) {
const result = findPathByValue(node.children, targetValue, path);
if (result) {
return result; // 如果子树中找到了结果,则返回
}
}
// 如果当前节点不是目标节点且子树中也没有找到,则从路径中移除当前节点
path.pop();
}
// 如果没有找到目标值,则返回null
return null;
}
// 使用示例
const treeData = [
{
label: "节点1",
value: "1",
children: [
{
label: "节点1-1",
value: "1-1",
},
{
label: "节点1-2",
value: "1-2",
}
]
},
{
label: "节点2",
value: "2",
children: [
{
label: "节点2-1",
value: "2-1",
}
]
}
];
console.log(findPathByValue(treeData, '1-2')); // 输出: 节点1/节点1-2
这个函数首先遍历给定的树结构,当找到一个节点的 value
与目标值匹配时,它会将当前路径(从根节点开始到该节点)反转并拼接成一个字符串。如果当前节点不是目标节点,且它有子节点,则函数会递归地在其子节点中继续查找。如果遍历完整棵树都没有找到目标值,则函数返回 null
。
注意,这里使用了 path.reverse().join('/')
来反转路径数组并将其元素用 /
连接起来,因为我们是从根节点开始构建路径的,但在最终输出时需要将其转换为从末节点到根节点的顺序。
你这个只有根节点->叶子节点的关系,没有叶子节点到->根节点的关系,所以从叶子节点向上遍历是行不通的。

但是我教你一招,你可以把数据喂给树组件,然后在树节点的点击事件中拿到树组件的node对象,他这个是有parent的信息的,就可以从叶子节点->root节点去遍历了,我用的是TDesign,ElementUI也是一样的道理