Javascript 层次树中的递归

Javascript 层次树中的递归,javascript,recursion,tree,hierarchy,Javascript,Recursion,Tree,Hierarchy,我打算迭代javascript中的层次结构树,以确定它有多少层。以下是我的树的一小段: parent: [ { id: 1 } { child1: [ { id: 2 } { child2: [ { id: 3 } {} ] } ], chil

我打算迭代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个级别(父级=1,子级1+子级3位于同一级别(2),子级4和子级5位于同一级别(3),子级6=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(
child1
child3

开始时,顶级
父级
子级被传递到函数中

我认为我的问题是
for
循环(
for(obj中的var I)
),因为这可能会抓住第一个子
parent
拥有的(
child1
),并最终返回
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": {}
            }
        ]
    }
];

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

尽管格式不同,但此解决方案会迭代数组中以及对象中的所有元素,并对它们进行计数

函数计数(数组){
var c=0;
array.forEach(函数(a){
C++;
如果(a的类型===‘对象’){
Object.keys(a).forEach(函数(k){
if(Array.isArray(a[k])){
c+=计数(a[k]);
}
});
}
});
返回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(''+JSON.stringify(count(parent),0,4)+'');
document.write(“”+JSON.stringify(父级,0,4)+’
”); document.write(''+JSON.stringify(count(newFormat),0,4)+'';
document.write(''+JSON.stringify(newFormat,0,4)+'')尽管格式不同,此解决方案会迭代数组中以及对象中的所有元素并对其进行计数

函数计数(数组){
var c=0;
array.forEach(函数(a){
C++;
如果(a的类型===‘对象’){
Object.keys(a).forEach(函数(k){
if(Array.isArray(a[k])){
c+=计数(a[k]);
}
});
}
});
返回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(''+JSON.stringify(count(parent),0,4)+'');
document.write(“”+JSON.stringify(父级,0,4)+’
”); document.write(''+JSON.stringify(count(newFormat),0,4)+'';
document.write(''+JSON.stringify(newFormat,0,4)+'')以下是一些示例代码,让您了解如何遍历数据-通过控制台可以看到信息

var a=[
{id:1},
{
儿童1:[
{id:2},
{
儿童2:[
{id:3},
{}
]
}
],
儿童3:[
{id:4},
{ 
儿童4:[
{id:5},
{}
],
儿童5:[
{id:6},
{
儿童6:[
{id:7},
{}
]
}
]
}
]
}
];
var getNumChildren=函数(obj){
var a=0;
if(obj[1]){
for(obj[1]中的var键){
a++;
var res=getNumChildren(obj[1][key]);
console.log(res,a);
a+=res;
}
}
返回a;
}

console.log(getNumChildren(a))以下是一些示例代码,让您了解如何遍历数据-通过控制台可以看到信息

var a=[
{id:1},
{
儿童1:[
{id:2},
{
儿童2:[
{id:3},
{}
]
}
],
儿童3:[
{id:4},
{ 
儿童4:[
{id:5},
{}
],
儿童5:[
{id:6},
{
儿童6:[
{id:7},
{}
]
}
]
}
]
}
];
var getNumChildren=函数(obj){
var a=0;
if(obj[1]){
for(obj[1]中的var键){
a++;
var res=getNumChildren(obj[1][key]);
console.log(res,a);
a+=res;
}
}
返回a;
}

console.log(getNumChildren(a))您可以控制数据的格式吗?数据似乎是以一种奇怪的方式编码的,具体地说,有些数组应该是对象,而对象应该是数组。@Daniel我正在和通过REST调用提供数据的人交谈,他说可以对数据进行操作。您认为如何更好地格式化它?我将从使用有效的JSON开始。这意味着您拥有的任何对象都应该被命名,否则您将使用类似数组的方式遍历对象。您是否可以控制数据的格式?看起来数据是经过编码的