我正在尝试从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可能会有所帮助,以明确表示它需要一个数组,而不是单个对象。

07-25 23:43