3

I have problem in converting simple json into json tree

The steps i need to follow are:

  1. finding parent having pid:0 will have some _id:'5a016637e986c90418e96ee9'

  2. finding above _id:5a016637e986c90418e96ee9 as pid in other object for example: will result in _id:5a0d852ce986c9041df2aafb and some others etc

  3. finding above _id i,e 5a0d852ce986c9041df2aafb so on..

Here is my json: https://jsfiddle.net/eabangalore/26gxm6dz/5/

I want to convert my json to like below one:

[
   {
    "_id": "5a016637e986c90418e96ee9",
    "pid": "0",
    "name": "general-categories",
    "nodes":[
         {
            "priority": 3,
            "name_lower": "tragedy",
            "_id": "5a0d852ce986c9041df2aafb",
            "pid": "5a016637e986c90418e96ee9",
            "name": "Tragedy",

          "nodes":[
                {
                "priority": 3,
                "name_lower": "natural",
                "_id": "5a0d8544e986c9041df2aafd",
                "pid": "5a0d852ce986c9041df2aafb",
                "name": "natural",

                "nodes":[

                   {
                      "priority": 3,
                      "name_lower": "earthquake",
                      "_id": "5a0d85c6e986c9041df2ab02",
                      "pid": "5a0d8544e986c9041df2aafd",
                      "name": "earthquake",
                      "nodes":[]  // so on ............
                    }
                ]
              }
          ]
        }
    ]
  }
]

see the output json here this how i want to convert my json:https://jsfiddle.net/Resendra/0uzmoy34/

see fiddle with full data: https://jsfiddle.net/eabangalore/fzonzxjt/73/

this is what i have tried(with half sample data):

var data = [{"categories":[{"_id":"5a016637e986c90418e96ee9","pid":"0","name":"general-categories"},{"priority":3,"name_lower":"tragedy","_id":"5a0d852ce986c9041df2aafb","pid":"5a016637e986c90418e96ee9","name":"Tragedy"},{"priority":3,"name_lower":"natural","_id":"5a0d8544e986c9041df2aafd","pid":"5a0d852ce986c9041df2aafb","name":"natural"},{"priority":3,"name_lower":"humans","_id":"5a0d8544e986c9041df2aafe","pid":"5a0d852ce986c9041df2aafb","name":"humans"},{"priority":3,"name_lower":"earthquake","_id":"5a0d85c6e986c9041df2ab02","pid":"5a0d8544e986c9041df2aafd","name":"earthquake"},{"priority":3,"name_lower":"floods","_id":"5a0d85c6e986c9041df2ab03","pid":"5a0d8544e986c9041df2aafd","name":"floods"},{"priority":3,"name_lower":"drought","_id":"5a0d85c6e986c9041df2ab04","pid":"5a0d8544e986c9041df2aafd","name":"drought"},{"priority":3,"name_lower":"landslides","_id":"5a0d85c6e986c9041df2ab05","pid":"5a0d8544e986c9041df2aafd","name":"landslides"},{"priority":3,"name_lower":"tsunami","_id":"5a0d85c6e986c9041df2ab07","pid":"5a0d8544e986c9041df2aafd","name":"tsunami"},{"priority":3,"name_lower":"forest-fire","_id":"5a0d85c6e986c9041df2ab09","pid":"5a0d8544e986c9041df2aafd","name":"forest-fire"},{"priority":3,"name_lower":"strom","_id":"5a0d85c6e986c9041df2ab0a","pid":"5a0d8544e986c9041df2aafd","name":"strom"},{"priority":3,"name_lower":"cyclone","_id":"5a0d85c6e986c9041df2ab0f","pid":"5a0d8544e986c9041df2aafd","name":"cyclone"},{"priority":3,"name_lower":"cloud-burst","_id":"5a0d85c6e986c9041df2ab12","pid":"5a0d8544e986c9041df2aafd","name":"cloud-burst"},{"priority":3,"name_lower":"rape","_id":"5a0d863ce986c9041df2ab14","pid":"5a0d8544e986c9041df2aafe","name":"rape"},{"priority":3,"name_lower":"kidnap","_id":"5a0d863ce986c9041df2ab15","pid":"5a0d8544e986c9041df2aafe","name":"kidnap"},{"priority":3,"name_lower":"hijack","_id":"5a0d863ce986c9041df2ab16","pid":"5a0d8544e986c9041df2aafe","name":"hijack"},{"priority":3,"name_lower":"terror-attack","_id":"5a0d863ce986c9041df2ab17","pid":"5a0d8544e986c9041df2aafe","name":"terror-attack"},{"priority":3,"name_lower":"bomb-blast","_id":"5a0d863ce986c9041df2ab18","pid":"5a0d8544e986c9041df2aafe","name":"bomb-blast"},{"priority":3,"name_lower":"harrasment/abuse","_id":"5a0d863ce986c9041df2ab1c","pid":"5a0d8544e986c9041df2aafe","name":"harrasment/abuse"},{"priority":3,"name_lower":"dowry","_id":"5a0d863ce986c9041df2ab1d","pid":"5a0d8544e986c9041df2aafe","name":"dowry"},{"priority":3,"name_lower":"honour-killing","_id":"5a0d863ce986c9041df2ab20","pid":"5a0d8544e986c9041df2aafe","name":"honour-killing"},{"priority":3,"name_lower":"murder","_id":"5a0d863ce986c9041df2ab21","pid":"5a0d8544e986c9041df2aafe","name":"murder"},{"priority":3,"name_lower":"sucide","_id":"5a0d8652e986c9041df2ab26","pid":"5a0d8544e986c9041df2aafe","name":"sucide"},{"priority":3,"name_lower":"roads","_id":"5a0d8670e986c9041df2ab28","pid":"5a016637e986c90418e96ee9","name":"Roads"},{"priority":3,"name_lower":"traffic","_id":"5a0d868ce986c9041df2ab2a","pid":"5a0d8670e986c9041df2ab28","name":"traffic"},{"priority":3,"name_lower":"state","_id":"5a0d868ce986c9041df2ab2b","pid":"5a0d8670e986c9041df2ab28","name":"state"},{"priority":3,"name_lower":"national","_id":"5a0d868ce986c9041df2ab2c","pid":"5a0d8670e986c9041df2ab28","name":"national"},{"priority":3,"name_lower":"budget","_id":"5a0d868ce986c9041df2ab2d","pid":"5a0d8670e986c9041df2ab28","name":"budget"},{"priority":3,"name_lower":"accidents","_id":"5a0d868ce986c9041df2ab2e","pid":"5a0d8670e986c9041df2ab28","name":"accidents"},{"priority":3,"name_lower":"trafficking","_id":"5a0d869fe986c9041df2ab34","pid":"5a0d8544e986c9041df2aafe","name":"trafficking"},{"priority":3,"name_lower":"animals","_id":"5a0d86aae986c9041df2ab36","pid":"5a0d869fe986c9041df2ab34","name":"animals"},{"priority":3,"name_lower":"human","_id":"5a0d86aae986c9041df2ab37","pid":"5a0d869fe986c9041df2ab34","name":"human"},{"priority":3,"name_lower":"railways","_id":"5a0d86c9e986c9041df2ab3a","pid":"5a016637e986c90418e96ee9","name":"Railways"},{"priority":3,"name_lower":"north","_id":"5a0d86d6e986c9041df2ab3c","pid":"5a0d86c9e986c9041df2ab3a","name":"North"},{"priority":3,"name_lower":"east","_id":"5a0d86d6e986c9041df2ab3d","pid":"5a0d86c9e986c9041df2ab3a","name":"east"},{"priority":3,"name_lower":"south","_id":"5a0d86d6e986c9041df2ab3e","pid":"5a0d86c9e986c9041df2ab3a","name":"south"},{"priority":3,"name_lower":"west","_id":"5a0d86d6e986c9041df2ab3f","pid":"5a0d86c9e986c9041df2ab3a","name":"west"},{"priority":3,"name_lower":"central","_id":"5a0d86d6e986c9041df2ab40","pid":"5a0d86c9e986c9041df2ab3a","name":"central"},{"priority":3,"name_lower":"budget","_id":"5a0d86e2e986c9041df2ab46","pid":"5a0d86c9e986c9041df2ab3a","name":"budget"},{"priority":3,"name_lower":"nature","_id":"5a12c1c7e986c90418cefdfd","pid":"5a016637e986c90418e96ee9","name":"Nature"},{"priority":3,"name_lower":"animals","_id":"5a12c1d8e986c90418cefdff","pid":"5a12c1c7e986c90418cefdfd","name":"Animals"},{"priority":3,"name_lower":"humans","_id":"5a12c1d8e986c90418cefe00","pid":"5a12c1c7e986c90418cefdfd","name":"Humans"},{"priority":3,"name_lower":"amphibians animals","_id":"5a12c277e986c90418cefe03","pid":"5a12c1d8e986c90418cefdff","name":"Amphibians animals"},{"priority":3,"name_lower":"tresstrial animals","_id":"5a12c277e986c90418cefe04","pid":"5a12c1d8e986c90418cefdff","name":"Tresstrial animals"},{"priority":3,"name_lower":"aquatic animals","_id":"5a12c277e986c90418cefe05","pid":"5a12c1d8e986c90418cefdff","name":"Aquatic animals"},{"priority":3,"name_lower":"arial animals","_id":"5a12c277e986c90418cefe06","pid":"5a12c1d8e986c90418cefdff","name":"Arial animals"},{"priority":3,"name_lower":"child","_id":"5a12c2c7e986c90418cefe0f","pid":"5a12c1d8e986c90418cefe00","name":"Child"},{"priority":3,"name_lower":"baby","_id":"5a12c2c7e986c90418cefe10","pid":"5a12c1d8e986c90418cefe00","name":"Baby"},{"priority":3,"name_lower":"adult","_id":"5a12c2c7e986c90418cefe11","pid":"5a12c1d8e986c90418cefe00","name":"Adult"},{"priority":3,"name_lower":"female","_id":"5a12c2d4e986c90418cefe15","pid":"5a12c2c7e986c90418cefe11","name":"female"},{"priority":3,"name_lower":"male","_id":"5a12c2d4e986c90418cefe16","pid":"5a12c2c7e986c90418cefe11","name":"male"},{"priority":3,"name_lower":"male","_id":"5a12c2d9e986c90418cefe19","pid":"5a12c2c7e986c90418cefe10","name":"male"},{"priority":3,"name_lower":"female","_id":"5a12c2d9e986c90418cefe1a","pid":"5a12c2c7e986c90418cefe10","name":"female"},{"priority":3,"name_lower":"female","_id":"5a12c2dde986c90418cefe1d","pid":"5a12c2c7e986c90418cefe0f","name":"female"},{"priority":3,"name_lower":"male","_id":"5a12c2dde986c90418cefe1e","pid":"5a12c2c7e986c90418cefe0f","name":"male"},{"priority":3,"name_lower":"politics","_id":"5a12c2ebe986c90418cefe21","pid":"5a016637e986c90418e96ee9","name":"Politics"},{"priority":3,"name_lower":"bjp","_id":"5a12c321e986c90418cefe23","pid":"5a12c2ebe986c90418cefe21","name":"BJP"},{"priority":3,"name_lower":"aidmk","_id":"5a12c321e986c90418cefe24","pid":"5a12c2ebe986c90418cefe21","name":"AIDMK"},{"priority":3,"name_lower":"bsp","_id":"5a12c321e986c90418cefe25","pid":"5a12c2ebe986c90418cefe21","name":"BSP"},{"priority":3,"name_lower":"congress","_id":"5a12c321e986c90418cefe26","pid":"5a12c2ebe986c90418cefe21","name":"Congress"},{"priority":3,"name_lower":"aap","_id":"5a12c321e986c90418cefe27","pid":"5a12c2ebe986c90418cefe21","name":"AAP"},{"priority":3,"name_lower":"dmk","_id":"5a12c321e986c90418cefe28","pid":"5a12c2ebe986c90418cefe21","name":"DMK"},{"priority":3,"name_lower":"others","_id":"5a12c322e986c90418cefe2b","pid":"5a12c2ebe986c90418cefe21","name":"Others"},{"priority":3,"name_lower":"government","_id":"5a12c32fe986c90418cefe31","pid":"5a016637e986c90418e96ee9","name":"Government"},{"priority":3,"name_lower":"state government","_id":"5a12c33be986c90418cefe33","pid":"5a12c32fe986c90418cefe31","name":"State government"},{"priority":3,"name_lower":"central government","_id":"5a12c33be986c90418cefe34","pid":"5a12c32fe986c90418cefe31","name":"Central government"},{"priority":3,"name_lower":"president rule","_id":"5a12c361e986c90418cefe39","pid":"5a12c32fe986c90418cefe31","name":"President rule"},{"priority":3,"name_lower":"president","_id":"5a12c38fe986c90418cefe3b","pid":"5a12c33be986c90418cefe34","name":"President"},{"priority":3,"name_lower":"elections","_id":"5a12c38fe986c90418cefe3c","pid":"5a12c33be986c90418cefe34","name":"Elections"},{"priority":3,"name_lower":"prime-minister","_id":"5a12c38fe986c90418cefe3d","pid":"5a12c33be986c90418cefe34","name":"Prime-Minister"},{"priority":3,"name_lower":"parilament","_id":"5a12c38fe986c90418cefe3e","pid":"5a12c33be986c90418cefe34","name":"Parilament"},{"priority":3,"name_lower":"mps","_id":"5a12c390e986c90418cefe3f","pid":"5a12c33be986c90418cefe34","name":"MPS"},{"priority":3,"name_lower":"mla","_id":"5a12c390e986c90418cefe40","pid":"5a12c33be986c90418cefe34","name":"MLA"},{"priority":3,"name_lower":"home-minister","_id":"5a12c3d5e986c90418cefe47","pid":"5a12c33be986c90418cefe33","name":"home-minister"},{"priority":3,"name_lower":"railway-minister","_id":"5a12c3d5e986c90418cefe49","pid":"5a12c33be986c90418cefe33","name":"railway-minister"},{"priority":3,"name_lower":"mps","_id":"5a12c3d5e986c90418cefe4a","pid":"5a12c33be986c90418cefe33","name":"MPs"},{"priority":3,"name_lower":"governer","_id":"5a12c3d5e986c90418cefe4b","pid":"5a12c33be986c90418cefe33","name":"Governer"},{"priority":3,"name_lower":"elections","_id":"5a12c3d5e986c90418cefe4c","pid":"5a12c33be986c90418cefe33","name":"Elections"},{"priority":3,"name_lower":"mla","_id":"5a12c3d5e986c90418cefe4d","pid":"5a12c33be986c90418cefe33","name":"MLA"},{"priority":3,"name_lower":"cheif-minister","_id":"5a12c3d5e986c90418cefe4e","pid":"5a12c33be986c90418cefe33","name":"Cheif-Minister"}]}]



function getParentObject(parentObj){

     var allParentObject = parentObj.filter(function(o){
        return o.parent == 0;
     });
     
     return allParentObject;
}

function getAllParentIds(allParentObject){

    var allActualParentIds = allParentObject.map(obj =>  obj._id);
    
    return allActualParentIds;
}

function getAllSubChilds(subchild){
    
    var subChildObject = subchild.filter(function(o,i){
        return o._id == subchild[i]._id;  
     });
     
     return subChildObject;
 }


function findNestedObjects(data,allParentObject,ActualParentId){
   
   var firstChild = getParentObject(data);
   
   var allActualParentIds = getAllParentIds(firstChild);
   
   var obj = {};
   
   
   //console.log('all childs', JSON.stringify(firstChild));
  
   
   if(firstChild.length){
        
        //allParentObject.nodes = firstChild;
        
        var subChildObject = getAllSubChilds(firstChild);
        
        console.log('sub child object ',JSON.stringify(subChildObject));
        
        var subChildIds = getAllParentIds(subChildObject);
        
        //onsole.log('all parent nodes ',JSON.stringify(allParentObject));
        
        //findNestedObjects(data,firstChild,ActualParentId);
   }else{
   
      allParentObject.nodes = [];  
   }
       
}

var allParentObject = getParentObject(data);

var allActualParentIds = getAllParentIds(allParentObject);


for(var i=0;i<allActualParentIds.length;i++){
  findNestedObjects(data,allParentObject[i],allActualParentIds[i]);  
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

see fiddle with full data: https://jsfiddle.net/eabangalore/fzonzxjt/73/

please help me thanks in advance!!!

  • 1
    Okay, in very broad strokes, the steps you could take take: (1) generate, from your original data, an auxiliary object containing, for each `pid` a list of the objects with that `pid`; (2) Iterate again over the original collection, filling `nodes` with the list from the auxiliary object whose key is the same as `_id`; (3) Once all that is done, take the object with `pid` zero; as long as the steps are implemented correctly, it will "automagically" contain the entire tree. – Haroldo_OK Feb 21 '18 at 17:04

2 Answers2

3

Here's a simple recursive algorythm for building this tree (I created a simplified version of your data but everything seems to be working fine):

function setNodes(obj, data) {
 obj.nodes = data.filter(x => x.pid === obj._id);
}

function populateLevel(arr, data) {
  arr.forEach(x => {
    setNodes(x, data);
    if (x.nodes.length) {
     populateLevel(x.nodes, data);
    }
  });
}

const json = [{
  "categories": [
   {
      "_id": "1",
      "pid": "0",
      "name": "general-categories"
    }, {
      "priority": 3,
      "name_lower": "tragedy",
      "_id": "2",
      "pid": "1",
      "name": "Tragedy"
    }, {
      "priority": 3,
      "name_lower": "natural",
      "_id": "3",
      "pid": "1",
      "name": "natural"
    }, {
      "priority": 3,
      "name_lower": "humans",
      "_id": "4",
      "pid": "2",
      "name": "humans"
    }, {
      "priority": 3,
      "name_lower": "earthquake",
      "_id": "5",
      "pid": "2",
      "name": "earthquake"
    }, {
      "priority": 3,
      "name_lower": "floods",
      "_id": "6",
      "pid": "3",
      "name": "floods"
    }, {
      "priority": 3,
      "name_lower": "drought",
      "_id": "7",
      "pid": "3",
      "name": "drought"
    }, {
      "priority": 3,
      "name_lower": "landslides",
      "_id": "8",
      "pid": "6",
      "name": "landslides"
    }, {
      "priority": 3,
      "name_lower": "tsunami",
      "_id": "9",
      "pid": "6",
      "name": "tsunami"
    }]
}];

const data = json[0].categories;
const startingLevel = data.filter(x => x.pid === '0');

populateLevel(startingLevel, data);

console.log(startingLevel);

Here's a jsfiddle: https://jsfiddle.net/ww71otLv/

Boris Lobanov
  • 2,409
  • 1
  • 11
  • 19
  • i will let you know by tommorow, as it is late night in india, from my view it will work fine –  Feb 21 '18 at 17:59
  • Great! Ping me if you have any other questions/problems – Boris Lobanov Feb 22 '18 at 06:26
  • Boris please see this question https://stackoverflow.com/questions/49284869/how-to-get-construct-object-in-specified-manner-from-given-object –  Mar 14 '18 at 18:07
1

I had to reduce your dataset, but this should do everything you are hoping for.

First we locate the node with the id give, then all children of that node, then all parents of that node. All of these nodes are added to a flattened array, then turned into a tree format.

The tree logic was modified from the post here: Build tree array from flat array in javascript

var dataObj = [{
  "categories": [{
    "_id": "5a016637e986c90418e96ee9",
    "pid": "0",
    "name": "general-categories"
  }, {
    "priority": 3,
    "name_lower": "tragedy",
    "_id": "5a0d852ce986c9041df2aafb",
    "pid": "5a016637e986c90418e96ee9",
    "name": "Tragedy"
  }, {
    "priority": 3,
    "name_lower": "natural",
    "_id": "5a0d8544e986c9041df2aafd",
    "pid": "5a0d852ce986c9041df2aafb",
    "name": "natural"
  }, {
    "priority": 3,
    "name_lower": "humans",
    "_id": "5a0d8544e986c9041df2aafe",
    "pid": "5a0d852ce986c9041df2aafb",
    "name": "humans"
  }, {
    "priority": 3,
    "name_lower": "earthquake",
    "_id": "5a0d85c6e986c9041df2ab02",
    "pid": "5a0d8544e986c9041df2aafd",
    "name": "earthquake"
  }, {
    "priority": 3,
    "name_lower": "floods",
    "_id": "5a0d85c6e986c9041df2ab03",
    "pid": "5a0d8544e986c9041df2aafd",
    "name": "floods"
  }, {
    "priority": 3,
    "name_lower": "drought",
    "_id": "5a0d85c6e986c9041df2ab04",
    "pid": "5a0d8544e986c9041df2aafd",
    "name": "drought"
  }, {
    "priority": 3,
    "name_lower": "rape",
    "_id": "5a0d863ce986c9041df2ab14",
    "pid": "5a0d8544e986c9041df2aafe",
    "name": "rape"
  }, {
    "priority": 3,
    "name_lower": "kidnap",
    "_id": "5a0d863ce986c9041df2ab15",
    "pid": "5a0d8544e986c9041df2aafe",
    "name": "kidnap"
  }, {
    "priority": 3,
    "name_lower": "roads",
    "_id": "5a0d8670e986c9041df2ab28",
    "pid": "5a016637e986c90418e96ee9",
    "name": "Roads"
  }, {
    "priority": 3,
    "name_lower": "traffic",
    "_id": "5a0d868ce986c9041df2ab2a",
    "pid": "5a0d8670e986c9041df2ab28",
    "name": "traffic"
  }, {
    "priority": 3,
    "name_lower": "state",
    "_id": "5a0d868ce986c9041df2ab2b",
    "pid": "5a0d8670e986c9041df2ab28",
    "name": "state"
  }, {
    "priority": 3,
    "name_lower": "trafficking",
    "_id": "5a0d869fe986c9041df2ab34",
    "pid": "5a0d8544e986c9041df2aafe",
    "name": "trafficking"
  }, {
    "priority": 3,
    "name_lower": "animals",
    "_id": "5a0d86aae986c9041df2ab36",
    "pid": "5a0d869fe986c9041df2ab34",
    "name": "animals"
  }, {
    "priority": 3,
    "name_lower": "human",
    "_id": "5a0d86aae986c9041df2ab37",
    "pid": "5a0d869fe986c9041df2ab34",
    "name": "human"
  }, {
    "priority": 3,
    "name_lower": "railways",
    "_id": "5a0d86c9e986c9041df2ab3a",
    "pid": "5a016637e986c90418e96ee9",
    "name": "Railways"
  }, {
    "priority": 3,
    "name_lower": "north",
    "_id": "5a0d86d6e986c9041df2ab3c",
    "pid": "5a0d86c9e986c9041df2ab3a",
    "name": "North"
  }, {
    "priority": 3,
    "name_lower": "east",
    "_id": "5a0d86d6e986c9041df2ab3d",
    "pid": "5a0d86c9e986c9041df2ab3a",
    "name": "east"
  }]
}];

// Find the all nodes associated to an id
function getNodesById(idToFind, nodesToSearch) {
  var nodeFound = nodesToSearch.find(possibleNode => possibleNode._id == idToFind);
  var relatedNodes = [ nodeFound ];

  if (nodeFound.pid != 0) {
    relatedNodes = relatedNodes.concat(getParentNodes(nodeFound.pid, nodesToSearch));
  }

  relatedNodes = relatedNodes.concat(getChildrenNodes(nodeFound._id, nodesToSearch));

  return relatedNodes;
}

// Get all parent nodes for a particular id, recursively
function getParentNodes(idToFind, nodesToSearch) {
  var nodeFound = nodesToSearch.find(possibleNode => possibleNode._id == idToFind);
  var relatedNodes = [ nodeFound ];

  if (nodeFound.pid != 0) {
    relatedNodes = relatedNodes.concat(getParentNodes(nodeFound.pid));
  }

  return relatedNodes;
}

// Get all child nodes for a particular node, recursively
function getChildrenNodes(idToFind, nodesToSearch) {
  var relatedNodes = nodesToSearch.filter(possibleNode => possibleNode.pid == idToFind);

  if (relatedNodes.length > 0) {
    relatedNodes.forEach(childNode => relatedNodes = relatedNodes.concat(getChildrenNodes(childNode._id, nodesToSearch)));
  }

  return relatedNodes;
}

// Loop flat array and build tree modified from https://stackoverflow.com/questions/18017869/build-tree-array-from-flat-array-in-javascript
function list_to_tree(list) {
  var map = {}, node, roots = [], i;
  for (i = 0; i < list.length; i += 1) {
    map[list[i]._id] = i; // initialize the map
    list[i].nodes = []; // initialize the children
  }
  for (i = 0; i < list.length; i += 1) {
    node = list[i];
    if (node.pid !== "0") {
      // if you have dangling branches check that map[node.pid] exists
      list[map[node.pid]].nodes.push(node);
    } else {
      roots.push(node);
    }
  }
  return roots;
}

// Nodes to search, could easily be a loop
var categoryNodes = dataObj[0].categories;

// Filtered flat array of nodes associated to an id
var filteredNodes = getNodesById('5a0d852ce986c9041df2aafb', categoryNodes);

// Make the flat array a tree structured array
console.log(list_to_tree(filteredNodes));

I am sure there is a more optimal way to do this, but this should fit your needs.

Phillip Thomas
  • 1,450
  • 11
  • 21