当前位置: 首页 > 知识库问答 >
问题:

javascript - 实现树形数据根据末节点value回溯至根节点的label拼接功能?

潘哲
2024-09-21

给一个 树结构 如何根据 末级节点信息 组装 末级到根节点的信息
比如 下面示例 根据value值1-2 返回拼接的自身和父级的label值 节点1/节点1-2

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",
        }]
    }
]

不知道啥思路

共有5个答案

鱼锦
2024-09-21

你这个只有根节点->叶子节点的关系,没有叶子节点到->根节点的关系,所以从叶子节点向上遍历是行不通的。
但是我教你一招,你可以把数据喂给树组件,然后在树节点的点击事件中拿到树组件的node对象,他这个是有parent的信息的,就可以从叶子节点->root节点去遍历了,我用的是TDesign,ElementUI也是一样的道理
image.png

image.png

敖永丰
2024-09-21

最简单粗暴的就是递归了,我给你一个。
第一个参数就是要遍历的某一个节点,第二个是要查找的值
function find(node,svalue){

    //找到了返回对应节点的label
    if(node.value == svalue){
        return node.label;
    }
    //没找到就检查是否有子节点,有就循环遍历找
    if(node.children){
        for(let i=0; i<node.children.length; i++){
            //递归检查每一个子节点
            let rs = find(node.children[i], svalue);
            if( rs != null){
                //我这里的null检查是因为人为构造了一个null根节点返回结果要去掉
                if(node.label != null){
                    return node.label +'/' + rs;
                }else{
                    return rs;
                }
            }
        }
    }
    return null;
}
//这里构造了一个根节点,值都是空的,子节点用你的数组
let str = find({label:null,value:null,children:treeData}, '1-2');
console.log(str);
和和煦
2024-09-21

树形数据遍历,调整为[{},{}....]格式,每个节点增加一个id,parent_id;
第一级节点id是treeData的index_x,parent_id等于0;
children节点的id是children迭代的index_j,parent_id为上一级节点id;
递归迭代拼接得到完成节点信息,直到parent_id为0为止

const newData = [
    {
        label: "节点1",
        value: "1",
        id:index_x,
        parent_id:0
    },
    {
        label: "节点1-1",
        value: "1-1",
        parentId:index_x,
        id:index_j
    },
    {
        label: "节点1-2",
        value: "1-2",
        parentId:index_x,
        id:index_j
    }......
]
浦泳
2024-09-21

回答:你采用对象数组形式存储,在后续从叶子节点到根节点的名称拼接时无法通过叶子节点找到父节点,所以有两种办法,第一种是在最初时为每个对象添加一个新属性:fullPath,最初采用递归遍历即可为每个节点添加到该属性,后续直接使用即可;第二种则是手动根据层次规律和唯一值去挨个遍历得到fullPath了,这个会和你的数据形式有关

岑彬炳
2024-09-21

为了实现从末节点回溯至根节点并拼接 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('/') 来反转路径数组并将其元素用 / 连接起来,因为我们是从根节点开始构建路径的,但在最终输出时需要将其转换为从末节点到根节点的顺序。

 类似资料:
  • 我正在通过为Ruby编写树库来研究树遍历算法。就基本建筑而言,似乎有两个合理的选择; 只有树。树有根值和子树 存在树和节点。一个节点有一个值,子节点。树有根节点和子树。子树的根节点是树的根节点的子节点 其中一种设计更常见吗?在这个库的开发过程中,1)太幼稚或2)不必要的冗余会变得“明显”吗?本图书馆的预期用途为一般用途;我希望它可以用于巨树、二进制搜索树或解析树等。 我能想到其他不那么合理的建筑;

  • 期望结果: 补充 结合边城用户的文章,最后得出的方法:

  • 所以我环顾了一下网络,在stackoverflow中有几个问题是定义: 通常,内部节点是任何不是叶子的节点(没有子节点) 非叶/非末端/内部节点-至少有一个度不等于0的子节点或后代节点 据我所知,它是一个节点,而不是一片叶子。 我即将得出结论,根也是一个内部节点,但它的定义似乎有些模糊,如图所示: 二元搜索树中的“内部节点”是什么? 正如这张精彩的图片所示,内部节点是位于树根和树叶之间的节点 如果

  • 本文向大家介绍DOM节点的根节点是不是body?相关面试题,主要包含被问及DOM节点的根节点是不是body?时的应答技巧和注意事项,需要的朋友参考一下 文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简

  • 在实时数据库中未创建根节点。所有依赖项均已实施,firebase已连接到该项目。这是代码。 public void onComplete(@非空任务任务){

  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?