js获取树形结构指定节点的路径

前几天在工作中业务提了个需求,大致意思是在树形表格中查看某个节点详情的时候,需要在详情页面将该节点的路径展示出来,下面就介绍一种节点获取路径的方法。

假设有如下一颗树

let treeArray = [{
        id: 1,
        nodeName: 'a',
        children: [{
                id: 11,
                nodeName: 'ab',
                children: [{
                        id: 111,
                        nodeName: 'abc'
                    },
                    {
                        id: 112,
                        nodeName: 'abd'
                    }
                ]
            },
            {
                id: 12,
                nodeName: 'ac',
                children: [{
                    id: 121,
                    nodeName: 'aca'
                }]
            }
        ]
    },
    {
        id: 2,
        nodeName: 'b'
    },
    {
        id: 3,
        nodeName: 'c',
        children: [{
                id: 31,
                nodeName: 'cb',
                children: [{
                        id: 311,
                        nodeName: 'cbc'
                    },
                    {
                        id: 312,
                        nodeName: 'cbd'
                    }
                ]
            },
            {
                id: 32,
                nodeName: 'cc',
                children: [{
                    id: 321,
                    nodeName: 'cca'
                }]
            }
        ]
    },
    {
        id: 4,
        nodeName: 'd'
    }
];

// 首先我们先定义个数组,用来保存路径节点id
let nodePathArray= []

// (tree为目标树,targetId为目标节点id)
function getNodeRoute(tree, targetId) {
	for (let index = 0; index < tree.length; index++) {
	    if (tree[index].children) {
	        let endRecursiveLoop = getNodeRoute(tree[index].children, targetId)
	        if (endRecursiveLoop) {
	            nodePathArray.push(tree[index].id)
	            return true
	        }
	    }
	    if (tree[index].id === targetId) {
	        nodePathArray.push(tree[index].id)
	        return true
	    }
	}
}

getNodeRoute(treeArray,112) //查找id为112的节点路径
console.log(nodePathArray.reverse().join('->'));

这种方式简单粗暴,但是有个小缺点,就是找到节点之后回归,数组添加顺序是先将目标节点添加到数组中,而后再添加其父节点……(子节点->父节点->…->根节点)。所以代码执行完成之后需要通过reverse将数组反转一下才能得到正确的路径。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用递归方式查询树形结构节点路径,具体步骤如下: 1. 定义一个递归函数,输入参数为树形结构节点和目标字段值。 2. 如果当前节点的字段值与目标值相等,则返回当前节点。 3. 否则,遍历当前节点子节点,递归调用函数,直到找到目标节点为止。 4. 如果找到目标节点,则将当前节点路径添加到结果中。 5. 返回结果路径。 代码示例: ```javascript function findPath(node, targetValue) { if (node.value === targetValue) { return [node.name]; } else { for (let child of node.children) { let path = findPath(child, targetValue); if (path.length > 0) { return [node.name, ...path]; } } return []; } } // 示例数据 const tree = { name: 'A', value: 1, children: [ { name: 'B', value: 2, children: [ { name: 'D', value: 4, children: [] }, { name: 'E', value: 5, children: [] } ] }, { name: 'C', value: 3, children: [] } ] } // 查询节点路径 const targetValue = 4; const path = findPath(tree, targetValue); console.log(path); // ['A', 'B', 'D'] ``` 上面的代码中,我们定义了一个 `findPath` 函数,它接收两个参数:`node` 表示当前节点,`targetValue` 表示目标字段值。如果当前节点的值等于目标值,则返回当前节点的名称;否则,遍历子节点,递归调用 `findPath` 函数,直到找到目标节点为止。如果找到目标节点,则将当前节点的名称添加到结果中,并返回结果。最终结果是一个数组,表示从根节点到目标节点路径。 注意,上面示例中的代码仅适用于每个节点都有唯一的值的情况。如果节点的值不唯一,则需要对节点进行标识,例如为每个节点增加一个唯一的 `id` 属性,然后在 `findPath` 函数中比较 `id` 值。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值