无法尝试递归循环树

时间:2017-10-18 20:27:26

标签: javascript recursion tree

我正在尝试遍历树及其项目以便通过其style={{visibility: "hidden", ...查找节点,这是代码:

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> 递归函数返回undefined时,我遇到了问题。有关如何解决这个问题的任何提示?

2 个答案:

答案 0 :(得分:5)

for (let x of node.items) {
  return getNode(x, id);
}

这将查看第一个项目,无论它找到什么,它都会返回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();

答案 1 :(得分:-2)

你不能对此进行递归,因为没有&#34;项目&#34; items [0]的属性,因此递归停止

{
    id: 1,
    label: "one"
}

并返回undefined。