2017-02-14 78 views
0

我想遞歸遍歷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) 

回答

2

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

let cluster {...}; 

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

getLeafNodes([cluster]); 
1

這將返回所有節點與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作爲參數,而不是返回它。我認爲這是你出錯的地方。

2

而另一個代碼:

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

    return traverse([], nodes); 
} 

getLeafNodes(cluster); 
+0

我喜歡你的解決方案,但它是很難理解,接受的答案是很容易理解我。謝謝! – Sudhakar