Javascript递归,foreach循环赢了退出?

时间:2018-04-25 15:03:47

标签: javascript recursion

我构建了一个简单的Javascript树视图,其中每个Node都有一个名称,一个子列表和一个ID:

class Node {
  constructor(name, childNodes, id) {
    this.name = name;
    this.childNodes = childNodes;
    this.id = id;
  }
}

我的目标是创建一个函数" getNodeById(parent,id)",它返回具有给定ID的节点。我尝试过使用递归方法,但某处出现了错误:

function getNodeById(currentNode, id) {
  if (currentNode.id === id) { console.log("found"); return currentNode; }
  currentNode.children.forEach(child => {
    console.log(child);
    return getNodeById(child, id);
  });
}

我的想法是,该函数将搜索childNodes并再次调用自己。找到正确的节点后,应该在if语句之后返回,然后在foreach循环中返回。该函数成功找到正确的节点,但它不会停止并返回节点。这是调用getNodeById(parent,2);

时的输出

enter image description here

为什么"找不到"?

后功能退出

4 个答案:

答案 0 :(得分:2)

  

除了抛出异常之外,没有办法停止或中断forEach()循环。如果您需要这样的行为,则forEach()方法是错误的工具。

     

提前终止可以通过以下方式完成:

     

一个简单的循环

     

A for ... of循环

     

Array.prototype.every()

     

Array.prototype.some()

     

Array.prototype.find()

     

Array.prototype.findIndex()   其他Array方法:every(),some(),find()和findIndex()测试数组元素,谓词返回一个truthy值,以确定是否需要进一步迭代。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

答案 1 :(得分:1)

getNodeById()不会返回任何内容。您正在从forEach()采取的右箭头函数返回,并且没有做任何事情。使用for循环。

答案 2 :(得分:1)

function getNodeById(currentNode, id) {
  if (currentNode.id === id) { console.log("found"); return currentNode; }
  for(node = 0; node < currentNode.children.length; node ++) {
    const foundNode = getNodeById(currentNode.children[node], id);
    if(foundNode) {
      return foundNode
    }
  }
  return undefined
}

这应该有用!!

答案 3 :(得分:1)

您可以使用Array#some的短路并返回存储的节点(如果找到)。

  

some()为数组中的每个元素执行一次callback函数,直到找到callback返回 truthy 值的值(成为的值)转换为布尔值时true

function getNodeById(currentNode, id) {
    var node;
    if (currentNode.id === id) {
        return currentNode;
    }
    currentNode.children.some(child => node = getNodeById(child, id));
    return node;
}