JavaScript通过子节点的值反向获取其父级链条,递归寻找

有这样的需求:知道一个值在某个数组当中,但是不确定在哪一级,想把该值的父级链条找出来。

1、数组对象

let arr = [
        {
            "children" : [
                {
                    "children" : [
                        {
                            level:3,
                            name:'银杏纲'
                        },
                        {
                            "children" : [
                                {
                                    "children" : [
                                        {
                                            "children" : [
                                                {
                                                    level:6,
                                                    name:'苏铁属'
                                                },
                                            ],
                                            level:5,
                                            name:'苏铁科'
                                        },
                                    ],
                                    level:4,
                                    name:'苏铁目'
                                },
                            ],
                            level:3,
                            name:'苏铁纲'
                        },
                    ],
                    level:2,
                    name:'裸子植物门'
                },
                {
                    "children" : [
                        {
                            "children" : [
                                {
                                    "children" : [
                                        {
                                            "children" : [
                                                {
                                                    level:6,
                                                    name:'蔷薇属'
                                                },
                                            ],
                                            level:5,
                                            name:'蔷薇科'
                                        },
                                        {
                                            "children" : [
                                                {
                                                    level:6,
                                                    name:'无尾果属'
                                                },
                                            ],
                                            level:5,
                                            name:'蔷薇科'
                                        },
                                    ],
                                    level:4,
                                    name:'蔷薇目'
                                },
                            ],
                            level:3,
                            name:'双子叶植物纲'
                        },
                    ],
                    level:2,
                    name:'被子植物门'
                },
            ],
            level:1,
            name:'植物界'
        },
        {
            "children" : [
                {
                    level:2,
                    name:'古虫动物门'
                },
                {
                    "children" : [
                        {
                            level:3,
                            name:'鱼纲'
                        }
                    ],
                    level:2,
                    name:'脊索动物门'
                }
            ],
            level:1,
            name:'动物界'
        }
    ]

2、通过子节点的值反向获取其父级链条:递归寻找

    function getParent(item, childrens, v){
        let arrRes = [];
        if(item.name == v){
            arrRes.unshift(item);
            return arrRes
        }
        let shangyiji;
        let recursive = (parent, children, v) => {
            for(let j = 0, length = children.length; j < length; j++){
                let node = children[j];
                if(node.name == v){
                    arrRes.unshift(node);
                    if(Object.is(children, childrens)){
                        arrRes.unshift(item);
                        break
                    }
                    recursive(parent, parent.children, shangyiji.name);//找到了,再从顶级的children里面开始找目标值的父级的父级
                    break;
                } else {
                    let aa = !!node.children
                    if(!!node.children){
                        shangyiji = node;//记录上一级的节点,找到了的时候用
                        recursive(parent, node.children, v);//没找到,并且还有children,就继续往下找
                    }
                }
            }
            return arrRes;
        };
        arrRes = recursive(item, childrens, v);
        return arrRes;
    }

    //测试
    let typeTree;
    for(let i = 0; i < arr.length; i++){
        typeTree=getParent(arr[i], arr[i].children, "蔷薇科")
        if(typeTree.length>0){
            break;
        }
    }
    let nameTree = []
    typeTree.forEach(iType=>{
        nameTree.push(iType.name)
    })
    console.log({typeTree,nameTree});

3、控制台输出结果:

{
    nameTree: ["植物界", "被子植物门", "双子叶植物纲", "蔷薇目", "蔷薇科"],
    typeTree: [{...}, {...}, {...}, {...}, {...}]
}

4、数据结构
在这里插入图片描述
[参考链接]:https://blog.csdn.net/qq_36437172/article/details/87198122

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过递归方式获取所有节点子节点,您可以使用深度优先搜索(DFS)算法。以下是一个示例的Java代码: ```java import java.util.ArrayList; import java.util.List; class Node { private String name; private List<Node> children; public Node(String name) { this.name = name; this.children = new ArrayList<>(); } public void addChild(Node child) { children.add(child); } public List<Node> getChildren() { return children; } public String getName() { return name; } } public class RecursiveQuery { public static void main(String[] args) { // 创建节点 Node root = new Node("Root"); Node node1 = new Node("Node 1"); Node node2 = new Node("Node 2"); Node node3 = new Node("Node 3"); // 构建树结构 root.addChild(node1); root.addChild(node2); node1.addChild(node3); // 查询所有节点子节点 List<Node> allNodes = new ArrayList<>(); getAllNodes(root, allNodes); for (Node node : allNodes) { System.out.println(node.getName()); } } public static void getAllNodes(Node node, List<Node> allNodes) { allNodes.add(node); List<Node> children = node.getChildren(); for (Node child : children) { getAllNodes(child, allNodes); } } } ``` 以上代码定义了一个`Node`类来表示树的节点,每个节点包含一个名称和子节点列表。`getAllNodes`方法使用递归的深度优先搜索算法来获取给定节点及其所有子节点,并将它们添加到一个列表中。然后,可以通过调用`getAllNodes`方法来查询所有节点子节点,并将结果打印出来。 这个示例中,根节点为"Root",有两个子节点"Node 1"和"Node 2","Node 1"又有一个子节点"Node 3"。运行以上代码,将输出以下结果: ``` Root Node 1 Node 3 Node 2 ``` 这就是通过递归方式获取所有节点子节点的实现。您可以根据您的实际需求进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值