关于树形结构递归问题

下面是接口模拟数据,我需要根据不同父节点,用户点击会执行不同逻辑,也就是通过递归方式,用户任意点击一个树节点,怎么知道当前是第几层节点

比如如果用户点击模块节点,就让页面按钮变灰,禁止用户点击,如果点击绩效,就让按钮恢复并高亮,允许用户点击,就是我怎么知道用户点击了哪个节点呢,不可能通过节点名字去判断吧,节点有几层是未知的
图片描述

let arr = [{
        "id": 90,
        "name": "MS",
        "pareid": 0,
        "children": [{
            "id": 736,
            "name": "模块",
            "pareid": 90,
            "children": [{
                "id": 739,
                "name": "资产",
                "pareid": 736,
                "children": [{
                    "id": 971,
                    "name": "绩效",
                    "pareid": 739,
                }]
            }, {
                "id": 741,
                "name": "交易_a",
                "pareid": 736,
                "children": [{
                    "id": 742,
                    "name": "盘前",
                    "pareid": 741,
                }, {
                    "id": 743,
                    "name": "总览",
                    "pareid": 741,
                }, {
                    "id": 744,
                    "name": "指令_a",
                    "pareid": 741,
                }, {
                    "id": 969,
                    "name": "证券",
                    "pareid": 741,
                }, {
                    "id": 972,
                    "name": "交易_s",
                    "pareid": 741,
                }, {
                    "id": 985,
                    "name": "_a监控",
                    "pareid": 741,
                }, {
                    "id": 995,
                    "name": "期指",
                    "pareid": 741,
                }, {
                    "id": 1008,
                    "name": "监_控",
                    "pareid": 741,
                }, {
                    "id": 1009,
                    "name": "信_息",
                    "pareid": 741,
                }, {
                    "id": 1010,
                    "name": "日_报",
                    "pareid": 741,
                }, {
                    "id": 1019,
                    "name": "历史",
                    "pareid": 741,
                }, {
                    "id": 1032,
                    "name": "多基",
                    "pareid": 741,
                }, {
                    "id": 1033,
                    "name": "预警",
                    "pareid": 741,
                }, {
                    "id": 1034,
                    "name": "成交",
                    "pareid": 741,
                }, {
                    "id": 1035,
                    "name": "交易_2",
                    "pareid": 741,
                }, {
                    "id": 1036,
                    "name": "实时_w",
                    "pareid": 741,
                }, {
                    "id": 1037,
                    "name": "分析a",
                    "pareid": 741,
                }]
            }]
        }, {
            "id": 997,
            "name": "特殊",
            "pareid": 90,
            "children": [{
                "id": 996,
                "name": "所有",
                "pareid": 997,
            }, {
                "id": 1024,
                "name": "hg",
                "pareid": 997,
            }, {
                "id": 1025,
                "name": "管理",
                "pareid": 997,
            }, {
                "id": 1026,
                "name": "交易员",
                "pareid": 997,
            }, {
                "id": 1028,
                "name": "债_kl",
                "pareid": 997,
            }, {
                "id": 1029,
                "name": "理h员",
                "pareid": 997,
            }, {
                "id": 1040,
                "name": "模_e拟",
                "pareid": 997,
            }, {
                "id": 1041,
                "name": "清_df算",
                "pareid": 997,
            }, {
                "id": 1340,
                "name": "关联_方",
                "pareid": 997,
            }, {
                "id": 1350,
                "name": "关联r_方",
                "pareid": 997,
            }, {
                "id": 1351,
                "name": "关联_n方",
                "pareid": 997,
            }, {
                "id": 1352,
                "name": "关联v_方",
                "pareid": 997,
            }, {
                "id": 1353,
                "name": "关联_g方",
                "pareid": 997,
            }, {
                "id": 1354,
                "name": "_1v1",
                "pareid": 997,
            }, {
                "id": 1355,
                "name": "_1vn",
                "pareid": 997,
            }]
        }]
    }];
    
    recursion = (cityData) => {
        for (let i = 0; i < cityData.length; i++) {
            const childs = cityData[i].children;
            if(childs && childs.length > 0) {// 如果还有子节点,执行递归
                recursion(childs);
            }
        }
    }
    recursion(arr);
阅读 3.8k
2 个回答
recursion = (cityData, time = 0) => {
        // 根据 time 来搞事情
        for (let i = 0; i < cityData.length; i++) {
            const childs = cityData[i].children;
            if(childs && childs.length > 0) {// 如果还有子节点,执行递归
                recursion(childs, time + 1);
            }
        }
    }
    recursion(arr);

即可

在每个child节点中放parent节点的引用,根节点的parent为null,然后在当前节点执行:
var cnt = 0;
for (var n = currentNode; n.parent != null; n = n.parent) cnt++;

这样循环结束后cnt就是当前节点的层数

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题