如何从简单的json制作所需的json树

我在将简单的json转换为json树时json问题

我需要遵循的步骤是:

  1. 找到父有pid:0会有一些_id:'5a016637e986c90418e96ee9'

  2. 在上面找到_id:5a016637e986c90418e96ee9作为其他object pid :例如:将导致_id:5a0d852ce986c9041df2aafb和其他一些等

  3. 找到上面_id i,e 5a0d852ce986c9041df2aafb等等..

这是我的json: https //jsfiddle.net/eabangalore/26gxm6dz/5/

我想将我的json转换为如下所示:

 [ { "_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 ............ } ] } ] } ] } ] 

看到输出json这里我想如何转换我的json: https //jsfiddle.net/Resendra/0uzmoy34/

看完全数据: https //jsfiddle.net/eabangalore/fzonzxjt/73/

这是我尝试过的(有一半样本数据):

 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]); } 
  

看完全数据: https //jsfiddle.net/eabangalore/fzonzxjt/73/

请提前帮助我!

这是一个简单的递归算法来构建这个树(我创建了一个简化的数据版本,但一切似乎都运行正常):

 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); 

我不得不减少你的数据集,但这应该做你希望的一切。

首先,我们找到具有id的节点,然后找到该节点的所有子节点,然后是该节点的所有父节点。 所有这些节点都被添加到展平的数组中,然后变成树格式。

从这里的post修改树逻辑: 在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));