我想遍历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(child1
和child3
)。首先,将顶级
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/