javascript - 递归函数没有被执行

标签 javascript recursion scenegraph

我正在尝试从 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/

相关文章:

events - 将交互添加到场景图中(在 Haskell 中)

javascript - Mapbox/Leaflet .bottom 控件在 map 上方呈现并且看不见

java - 删除 BST 中的节点(2)

java-3d - java3d 拾取对象

roku - 如何在 Roku SG 应用程序中实现深度链接?

javascript:在数组中查找重叠的圆圈

javascript - 如何在 JavaScript 中使 <a> 元素在单击链接后消失?

javascript - 后台 Javascript 程序

javascript - 如何创建包含 'pinned' 项的列表

javascript - 尝试将嵌套循环转换为递归函数