我构建了一个简单的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);
时的输出为什么"找不到"?
后功能退出答案 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;
}