无法尝试递归循环树

1 javascript tree recursion

我试图循环一个树和它的项目,以便通过它寻找一个节点id,这是代码:

<!DOCTYPE html>
<meta charset="utf-8">
<html>
<head>
  <title>Hi there</title>
  <script>
    function getNode(node, id) {
      if (node.id === id) {
        return node;
      }
      if (node.items) {
        for (let x of node.items) {
          return getNode(x, id);
        }
      }
    }

    function load() {
      var nodes = [{
        id: 0,
        label: 'root',
        items: [{
          id: 1,
          label: 'one'
        }, {
          id: 2,
          label: 'two'
        }, {
          id: 3,
          label: 'three'
        }, {
          id: 4,
          label: 'four'
        }]
      }];
      var n = nodes[0];
      var node = getNode(n, 3);
      console.log(node);
    }

    window.onload = load();
  </script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

当我调用load递归函数返回undefined 时,我遇到了问题.有关如何解决这个问题的任何提示?

Nic*_*wer 5

for (let x of node.items) {
  return getNode(x, id);
}
Run Code Online (Sandbox Code Playgroud)

这将查看第一个项目,无论它找到什么,它都会返回getNode的结果.所以它向下走到id = 1的项目,然后返回undefined,并继续返回未定义的堆栈.它永远不会移动到其他项目(即循环不做任何事情).

相反,它应该只在找到它时返回,或者转到下一个项目.

function getNode(node, id) {
  if (node.id === id) {
    return node;
  }
  if (node.items) {
    for (let x of node.items) {
      var result = getNode(x, id);
      if (result) {
        return result; //<<---- only returning if we found it
      }
    }
  }
}

function load() {
  var nodes = [{
    id: 0,
    label: 'root',
    items: [{
      id: 1,
      label: 'one'
    }, {
      id: 2,
      label: 'two'
    }, {
      id: 3,
      label: 'three'
    }, {
      id: 4,
      label: 'four'
    }]
  }];

  var n = nodes[0];

  var node = getNode(n, 3);
  console.log(node);
}

load();
Run Code Online (Sandbox Code Playgroud)