Dro*_*out 24 javascript recursion json
我试图返回JSON对象结构中的特定节点,如下所示
{
"id":"0",
"children":[
{
"id":"1",
"children":[...]
},
{
"id":"2",
"children":[...]
}
]
}
Run Code Online (Sandbox Code Playgroud)
所以这是一个像树一样的孩子 - 父母关系.每个节点都有一个唯一的ID.我试图找到一个特定节点这样
function findNode(id, currentNode) {
if (id == currentNode.id) {
return currentNode;
} else {
currentNode.children.forEach(function (currentChild) {
findNode(id, currentChild);
});
}
}
Run Code Online (Sandbox Code Playgroud)
我执行搜索,例如findNode("10", rootNode).但即使搜索找到匹配项,该函数也会返回undefined.我有一种不好的感觉,递归函数在找到匹配后不会停止并继续运行finally返回,undefined因为在后面的递归执行中它没有到达返回点,但我不知道如何解决这个问题.
请帮忙!
But*_*ak3 42
递归搜索时,必须通过返回结果传回结果.但是你没有归还结果findNode(id, currentChild).
function findNode(id, currentNode) {
var i,
currentChild,
result;
if (id == currentNode.id) {
return currentNode;
} else {
// Use a for loop instead of forEach to avoid nested functions
// Otherwise "return" will not work properly
for (i = 0; i < currentNode.children.length; i += 1) {
currentChild = currentNode.children[i];
// Search in the current child
result = findNode(id, currentChild);
// Return the result if the node has been found
if (result !== false) {
return result;
}
}
// The node has not been found and we have no more options
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
function findNode(id, currentNode) {
if (id == currentNode.id) {
return currentNode;
} else {
var result;
currentNode.children.forEach(function(node){
if(node.id == id){
result = node;
return;
}
});
return (result ? result : "No Node Found");
}
}
console.log(findNode("10", node));
Run Code Online (Sandbox Code Playgroud)
如果节点存在于节点列表中,则此方法将返回该节点。但这将循环遍历节点的所有子节点,因为我们无法成功中断流程forEach。更好的实现如下所示。
function findNode(id, currentNode) {
if (id == currentNode.id) {
return currentNode;
} else {
for(var index in currentNode.children){
var node = currentNode.children[index];
if(node.id == id)
return node;
findNode(id, node);
}
return "No Node Present";
}
}
console.log(findNode("1", node));
Run Code Online (Sandbox Code Playgroud)