Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript recursive search in JSON object

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!

like image 948
Dropout Avatar asked Mar 06 '14 11:03

Dropout


2 Answers

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;     } } 
like image 117
Butt4cak3 Avatar answered Sep 17 '22 02:09

Butt4cak3


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)); 
like image 32
Triode Avatar answered Sep 20 '22 02:09

Triode