我想在javascript中迭代一个分层树来确定它有多少级别。这是我树的一小段:
parent: [
{ id: 1 }
{
child1: [
{ id: 2 }
{
child2: [
{ id: 3 }
{}
]
}
],
child3: [
{ id: 4 }
{
child4: [
{ id: 5 }
{}
],
child5: [
{ id: 6 }
{
child6: [
{ id: 7 }
{}
]
}
]
}
]
}
]
将会有数目不详的父母和子女。有一个确定性:
我的目标是确定树具有的级别数。例如,此示例树中有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(child1
和child3
)。
在开始时,顶级parent
个孩子被传递到函数中。
我认为我的问题是for
循环(for (var i in obj)
),因为这可能会抓住第一个孩子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": {}
}
]
}
];
这似乎是更可行的数据,将于明天实施
答案 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)
这里有一些示例代码,可以让您了解如何遍历数据 - 通过控制台可以看到信息。
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;
就格式化数据而言,这种格式可能更有意义,更容易理解和使用
[
{"id":1,
"children":[
{"id":2,"children":[
{"id":4,"children":[]},
{"id":5,"children":[]}
]},
{"id":3,"children":[]}
]
}
]
修改的
如果更新数据格式,则可以使用此代码。
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;