Javascript 层次树中的递归
我打算迭代javascript中的层次结构树,以确定它有多少层。以下是我的树的一小段:Javascript 层次树中的递归,javascript,recursion,tree,hierarchy,Javascript,Recursion,Tree,Hierarchy,我打算迭代javascript中的层次结构树,以确定它有多少层。以下是我的树的一小段: parent: [ { id: 1 } { child1: [ { id: 2 } { child2: [ { id: 3 } {} ] } ], chil
parent: [
{ id: 1 }
{
child1: [
{ id: 2 }
{
child2: [
{ id: 3 }
{}
]
}
],
child3: [
{ id: 4 }
{
child4: [
{ id: 5 }
{}
],
child5: [
{ id: 6 }
{
child6: [
{ id: 7 }
{}
]
}
]
}
]
}
]
将有数量不详的父母和子女。有一点是肯定的:
- 每个元素(例如父元素)的数组中始终有2个对象。 第一个对象始终是一个ID。 第二个对象包含它的子对象。这可能是空的或已填充的
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开始。这意味着您拥有的任何对象都应该被命名,否则您将使用类似数组的方式遍历对象。您是否可以控制数据的格式?看起来数据是经过编码的