簡體   English   中英

提取所有葉節點的遞歸函數

[英]recursive function to extract all leaf nodes

我正在嘗試遞歸遍歷 json 樹並提取所有葉節點(具有 children=null 的節點)並返回一個平面列表。 我沒有得到完整的清單。 我只收到一件。 我想我快到了,但我無法弄清楚我在這里犯了什么錯誤。 請指教。

let cluster =  {
    "children": [
        {
            "children": [
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "engrlab-129-138.engrlab.com",
                    "resourceId": "13635212858517569813",
                    "resourceType": "host",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                }
            ],
            "expanded": true,
            "selected": false,
            "resourceName": "Hosts",
            "resourceId": "hosts_1",
            "resourceType": "hosts",
            "clusterId": "4478300518534191471",
            "group": null,
            "health": null,
            "level": 3
        },
        {
            "children": [
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Modules",
                    "resourceId": "15637959608568429034",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Schemas",
                    "resourceId": "13047253143282887930",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Meters",
                    "resourceId": "17708194274661652566",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Last-Login",
                    "resourceId": "13804286217083551733",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Triggers",
                    "resourceId": "16540036655917736056",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Security",
                    "resourceId": "15719129614781070270",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Fab",
                    "resourceId": "15346546234841845662",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Documents",
                    "resourceId": "8955207084521064900",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Extensions",
                    "resourceId": "16902376358803738229",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "opsdir-modules",
                    "resourceId": "17671323036239623175",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "App-Services",
                    "resourceId": "13845862599166782540",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "OpsDirector",
                    "resourceId": "11662986908968996065",
                    "resourceType": "database",
                    "clusterId": "4478300518534191471",
                    "group": null,
                    "health": null,
                    "level": 4
                }
            ],
            "expanded": true,
            "selected": false,
            "resourceName": "Databases",
            "resourceId": "databases_2",
            "resourceType": "databases",
            "clusterId": "4478300518534191471",
            "group": null,
            "health": null,
            "level": 3
        },
        {
            "children": [
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Manage",
                    "resourceId": "8298375594821661846",
                    "resourceType": "server",
                    "clusterId": "11227628265937443823",
                    "group": "Default",
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "OpsDirectorIO",
                    "resourceId": "17083255384250121954",
                    "resourceType": "server",
                    "clusterId": "11227628265937443823",
                    "group": "Default",
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "App-Services",
                    "resourceId": "15123715826272873087",
                    "resourceType": "server",
                    "clusterId": "11227628265937443823",
                    "group": "Default",
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "Admin",
                    "resourceId": "15145610355571980588",
                    "resourceType": "server",
                    "clusterId": "11227628265937443823",
                    "group": "Default",
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "HealthCheck",
                    "resourceId": "15612145677080623630",
                    "resourceType": "server",
                    "clusterId": "11227628265937443823",
                    "group": "Default",
                    "health": null,
                    "level": 4
                },
                {
                    "children": null,
                    "expanded": true,
                    "selected": false,
                    "resourceName": "OpsDirector",
                    "resourceId": "18324479201748050347",
                    "resourceType": "server",
                    "clusterId": "11227628265937443823",
                    "group": "Default",
                    "health": null,
                    "level": 4
                }
            ],
            "expanded": true,
            "selected": false,
            "resourceName": "App Servers",
            "resourceId": "servers_3",
            "resourceType": "servers",
            "clusterId": "4478300518534191471",
            "group": null,
            "health": null,
            "level": 3
        }
    ],
    "expanded": true,
    "selected": false,
    "resourceName": "engrlab-129-138.engrlab.com-cluster",
    "resourceId": "4478300518534191471",
    "resourceType": "cluster",
    "clusterId": "4478300518534191471",
    "group": null,
    "health": null,
    "level": 2
};

function getNodeList(nodes, result = []) {
      nodes = [].concat(nodes);
      result = [].concat(result);
      for (var i = 0; i < nodes.length; i++) {
          if(nodes[i].children)   {
            return getNodeList(nodes[i].children, result) 
          }
          if(!nodes[i].children) result.push(nodes[i]);
    };
    return result;
  }


getNodeList(cluster)

對您的功能進行了一些修改。 我認為這會返回所有葉節點。

let cluster {...};

function getLeafNodes(nodes, result = []){
  for(var i = 0, length = nodes.length; i < length; i++){
    if(!nodes[i].children || nodes[i].children.length === 0){
      result.push(nodes[i]);
    }else{
      result = getLeafNodes(nodes[i].children, result);
    }
  }
  return result;
}

getLeafNodes([cluster]);

還有另一個代碼:

function getLeafNodes(rootNode){
    function traverse(acc, node){
        if(node.children) 
            return node.children.reduce(traverse, acc);
        acc.push(node);
        return acc;
    }
    
    return traverse([], rootNode);
}

getLeafNodes(cluster);

這將返回所有子節點為null節點:

function getNodeList(object, list) {
    if (object.children) {
        for (var i = 0; i < object.children.length; i++) {
            getNodeList(object.children[i], list);
        }
    }
    else {
        list.push(object);
    }
}

list = []
getNodeList(cluster, list)
for (var i = 0; i < list.length; i++) {
    console.log(list[i])
}

請注意,我將list作為參數傳遞而不是返回它。 我認為這是你出錯的地方。

遞歸是一種函數式遺產,因此將它與函數式風格結合使用會產生最好的結果 -

 const cluster = {children:[{children:[{children:null,expanded:true,selected:false,resourceName:"engrlab-129-138.engrlab.com",resourceId:"13635212858517569813",resourceType:"host",clusterId:"4478300518534191471",group:null,health:null,level:4}],expanded:true,selected:false,resourceName:"Hosts",resourceId:"hosts_1",resourceType:"hosts",clusterId:"4478300518534191471",group:null,health:null,level:3},{children:[{children:null,expanded:true,selected:false,resourceName:"Modules",resourceId:"15637959608568429034",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"Schemas",resourceId:"13047253143282887930",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"Meters",resourceId:"17708194274661652566",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"Last-Login",resourceId:"13804286217083551733",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"Triggers",resourceId:"16540036655917736056",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"Security",resourceId:"15719129614781070270",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"Fab",resourceId:"15346546234841845662",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"Documents",resourceId:"8955207084521064900",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"Extensions",resourceId:"16902376358803738229",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"opsdir-modules",resourceId:"17671323036239623175",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"App-Services",resourceId:"13845862599166782540",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"OpsDirector",resourceId:"11662986908968996065",resourceType:"database",clusterId:"4478300518534191471",group:null,health:null,level:4}],expanded:true,selected:false,resourceName:"Databases",resourceId:"databases_2",resourceType:"databases",clusterId:"4478300518534191471",group:null,health:null,level:3},{children:[{children:null,expanded:true,selected:false,resourceName:"Manage",resourceId:"8298375594821661846",resourceType:"server",clusterId:"11227628265937443823",group:"Default",health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"OpsDirectorIO",resourceId:"17083255384250121954",resourceType:"server",clusterId:"11227628265937443823",group:"Default",health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"App-Services",resourceId:"15123715826272873087",resourceType:"server",clusterId:"11227628265937443823",group:"Default",health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"Admin",resourceId:"15145610355571980588",resourceType:"server",clusterId:"11227628265937443823",group:"Default",health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"HealthCheck",resourceId:"15612145677080623630",resourceType:"server",clusterId:"11227628265937443823",group:"Default",health:null,level:4},{children:null,expanded:true,selected:false,resourceName:"OpsDirector",resourceId:"18324479201748050347",resourceType:"server",clusterId:"11227628265937443823",group:"Default",health:null,level:4}],expanded:true,selected:false,resourceName:"App Servers",resourceId:"servers_3",resourceType:"servers",clusterId:"4478300518534191471",group:null,health:null,level:3}],expanded:true,selected:false,resourceName:"engrlab-129-138.engrlab.com-cluster",resourceId:"4478300518534191471",resourceType:"cluster",clusterId:"4478300518534191471",group:null,health:null,level:2} const leafs = (t = {}) => t.children ? t.children.flatMap(leafs) : [ t ] const result = leafs(cluster) console.log(JSON.stringify(result))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM