我正在尝试从 JSON 文件递归加载场景图结构。 我的想法是在所有子节点上调用相同的函数,直到最后一个节点没有子节点。然而,在调试代码时,我发现第二个循环内的 loadNodes 递归调用被忽略,而循环只是增加计数器并从下一个循环开始。
我检查了我的语法,并检查了循环内的其他函数的调用(有效)..
有人知道我做错了什么吗?
function loadNodes(obj, current_group_node) {
for (let i = 0; i < obj.length; i++) {
if (obj[i].nodetype === 'group') {
let new_group_node = new GroupNode(new Matrix(obj[i].matrix));
current_group_node.add(new_group_node);
for (let j = 0; j < obj[i].children.length; j++) {
loadNodes(obj[i].children[j], new_group_node);
}
} else {
// some more logic
}
}
}
我的函数接收具有以下可能结构的对象数组:
{
"nodetype": "group",
"name": "root",
"matrix": [
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
],
"children": [
{
"nodetype": "group",
"name": "driver-cube-group",
"matrix": [
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
],
"children": [
{
"nodetype": "aabox",
"name": "driver-cube",
"minpoint": {
"x": -3,
"y": -3,
"z": -3,
"w": 1
},
"maxpoint": {
"x": -2,
"y": -2,
"z": -2,
"w": 1
},
"color": {
"x": 1,
"y": 1,
"z": 1,
"w": 1
}
}
]
}
]
}
最佳答案
loadNodes
期望第一个参数是对象数组,而不是单个对象。您不需要在每个子对象上循环调用它,只需调用一次,并将 child
数组作为参数传递。它对数组进行自己的循环。
所以替换这个:
for (let j = 0; j < obj[i].children.length; j++) {
loadNodes(obj[i].children[j], new_group_node);
}
与:
loadNodes(obj[i].children, new_group_node);
将第一个参数从 obj
重命名为 arr
可能会有所帮助,以明确它需要一个数组,而不是单个对象。
关于javascript - 递归函数没有被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156184/