分层树中的递归

时间:2016-03-10 16:20:37

标签: javascript recursion tree hierarchy

我想在javascript中迭代一个分层树来确定它有多少级别。这是我树的一小段:

parent: [
   { id: 1 }
   {
       child1: [
           { id: 2 }
           {
               child2: [
                   { id: 3 }
                   {}
               ]
           }
       ],
       child3: [
           { id: 4 }
           { 
               child4: [
                   { id: 5 }
                   {}
               ],
               child5: [
                   { id: 6 }
                   {
                       child6: [
                           { id: 7 }
                           {}
                       ]
                   }
               ]
           }
       ]
   }
]

将会有数目不详的父母和子女。有一个确定性:

  • 每个元素(例如父元素)总是在其中包含2个对象的数组。 第一个对象始终是ID。 第二个对象包含它拥有的孩子。这可能是空的或填充

我的目标是确定树具有的级别数。例如,此示例树中有4个级别(parent = 1,child1 + child3位于同一级别(2),child4和child5位于同一级别(3)且child6 = 4)。

到目前为止,这是我的代码:

for (var j in dependencyTree) {
    if (getObjectSize(dependencyTree[j][1]) > 0) {
        levelsArray.push(j + ': ' + recursiveFunction(dependencyTree[j][1], 1));
    }
}


function recursiveFunction(obj, lvls) {
    if (getObjectSize(obj) > 0) {
        for (var i in obj) {
            recursiveFunction(obj[i][1], lvls++);
        }
    }
    return lvls;
}

getObjectSize()只返回对象的大小。即有多少直接的孩子。例如,对象parent将返回2(child1child3)。

在开始时,顶级parent个孩子被传递到函数中。

我认为我的问题是for循环(for (var i in obj)),因为这可能会抓住第一个孩子parentchild1)并最终返回级别数即使child1有更多内容,child3也有。

任何帮助表示感谢。

(尚未尝试过lodash,但有人告诉它不提供递归帮助)

修改

{
    "Mobile": [
        {
            "id": 89
        },
        { 
            "Mobile Client": [
                {
                    "id": 100 
                },
                {}
            ]
        }
    ],
    "Service Platform": [
        {
            "id": 90
        },
        {
            "Service Platform": [
                {..."

编辑(新提议的格式)

我和我的同事谈过,新建议的数据格式是:

[
    {
        "name": "Mobile",
        "id": 89,
        "children": [
            {
                "name": "Mobile Client",
                "id": 100,
                "children": {}
            }
        ]
    }
];

这似乎是更可行的数据,将于明天实施

2 个答案:

答案 0 :(得分:1)

尽管有这种格式,但这个解决方案会迭代数组中的所有元素以及对象并计算它们。

function count(array) {
    var c = 0;
    array.forEach(function (a) {
        c++;
        if (typeof a === 'object') {
            Object.keys(a).forEach(function (k) {
                if (Array.isArray(a[k])) {
                    c += count(a[k]);
                }
            });
        }
    });
    return c;
}

var parent = [{ id: 1 }, { child1: [{ id: 2 }, { child2: [{ id: 3 }, {}, ] }], child3: [{ id: 4 }, { child4: [{ id: 5 }, {}], child5: [{ id: 6 }, { child6: [{ id: 7 }, {}] }] }] }],
    newFormat = [{ "name": "Mobile", "id": 89, "children": [{ "name": "Mobile Client", "id": 100, "children": {} }] }];

document.write('<pre>' + JSON.stringify(count(parent), 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(parent, 0, 4) + '</pre><hr>');
document.write('<pre>' + JSON.stringify(count(newFormat), 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(newFormat, 0, 4) + '</pre>');

答案 1 :(得分:1)

这里有一些示例代码,可以让您了解如何遍历数据 - 通过控制台可以看到信息。

&#13;
&#13;
var a = [
   { id: 1 },
   {
   child1: [
       { id: 2 },
       {
           child2: [
               { id: 3 },
               {}
           ]
       }
   ],
   child3: [
       { id: 4 },
       { 
           child4: [
               { id: 5 },
               {}
           ],
           child5: [
               { id: 6 },
               {
                   child6: [
                       { id: 7 },
                       {}
                   ]
               }
           ]
       }
   ]
   }
];

var getNumChildren=function(obj){
  var a = 0;
  if(obj[1]){
for (var key in obj[1]) {
  a++;
  var res = getNumChildren(obj[1][key]);
  console.log(res,a);
  a += res;
}
  }
  return a;
}


console.log(getNumChildren(a));
&#13;
&#13;
&#13;

就格式化数据而言,这种格式可能更有意义,更容易理解和使用

[
  {"id":1,
    "children":[
      {"id":2,"children":[
        {"id":4,"children":[]},
        {"id":5,"children":[]}
      ]},
      {"id":3,"children":[]}
    ]
  }
]

修改

如果更新数据格式,则可以使用此代码。

&#13;
&#13;
var data =[
  {"id":1,
    "children":[
      {"id":2,"children":[
        {"id":4,"children":[]},
        {"id":5,"children":[]}
      ]},
      {"id":3,"children":[]}
    ]
  },
  {"id":6,"children":[]}
]

var getNumChildren=function(ca){
  var n = ca.length;
  ca.map(function(c){n += getNumChildren(c.children);})
  return n
}

document.write("result: " + getNumChildren(data));
&#13;
&#13;
&#13;