我正在尝试从JSON文件递归加载Scenegraph结构。
我的想法是在所有子节点上调用相同的函数,直到最后一个节点没有子节点为止。但是,在调试代码时,我发现第二个循环内的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
可能会有所帮助,以明确表示它需要一个数组,而不是单个对象。