我想遍历javascript中的分层树以确定它有多少个级别。这是我的树的一小段:

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


将会有数量未知的父母和孩子。有1个确定性:


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


我的目标是确定树的级别数。例如,此示例树中有4个级别(父代= 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)),因为这可能会抢夺parent具有的第一个孩子(child1),即使child1具有更多。

任何帮助表示赞赏。

(尚未尝试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": {}
            }
        ]
    }
];


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

最佳答案

尽管有格式,但此解决方案会遍历数组以及objecs中的所有元素,并对它们进行计数。



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>');

关于javascript - 层次树中的递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35921853/

10-11 12:15