I am trying to return a specific node in a JSON object structure which looks like this
{ "id":"0", "children":[ { "id":"1", "children":[...] }, { "id":"2", "children":[...] } ] }
So it's a tree-like child-parent relation. Every node has a unique ID. I'm trying to find a specific node like this
function findNode(id, currentNode) { if (id == currentNode.id) { return currentNode; } else { currentNode.children.forEach(function (currentChild) { findNode(id, currentChild); }); } }
I execute the search for example by findNode("10", rootNode)
. But even though the search finds a match the function always returns undefined
. I have a bad feeling that the recursive function doesn't stop after finding the match and continues running an finally returns undefined
because in the latter recursive executions it doesn't reach a return point, but I'm not sure how to fix this.
Please help!
When searching recursively, you have to pass the result back by returning it. You're not returning the result of findNode(id, currentChild)
, though.
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; } }
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));
This method will return the node if it present in the node list. But this will loop through all the child of a node since we can't successfully break the forEach
flow. A better implementation would look like below.
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));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With