user5405873
user5405873

Reputation:

how to make desired json tree from simple json

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!!!

Upvotes: 3

Views: 496

Answers (2)

Phillip Thomas
Phillip Thomas

Reputation: 1469

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.

Upvotes: 1

Boris Lobanov
Boris Lobanov

Reputation: 2454

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/

Upvotes: 3

Related Questions