我有一个层次结构数据,可以看作是树结构。
第一
我需要将此分层树拆分为子树并获取所有子树。 以下功能是我的工作方式,效果很好
var hierarchObjects = [];
traverseNodes(root);
function traverseNodes(root){
hierarchObjects.push(root);
for(var i=0; i<root.children.length; ++i)
{
traverseNodes(root.children[i]);
}
}
第二
我需要在数组hierarchObjects
中为子树的每个级别分组节点。子树的深度也不同。
例如,
将level1的子树的节点放在数组Level1
中。
将level2的子树的节点放在数组Level2
中。
那么我应该为Second
进程做些什么?
对于所有流程,是否有更有效的方法?
因为我的数据集有点大,而且有大约1300个子树,我需要找到一种有效的方法吗?
我的数据集是树结构:http://www.csee.umbc.edu/~yongnan/untitled/pathwayHierarchy.json
您可以看到它是parent
----- children
结构树。
对于这棵树,我使用步骤1分割成子树。 对于每个子树,示例如下:
1
{
"dbId": "111461",
"name": "Cytochrome c-mediated apoptotic response",
"children": [
{
"dbId": "111458",
"name": "Formation of apoptosome",
"children": [],
"size": 1
},
{
"dbId": "111459",
"name": "Activation of caspases through apoptosome-mediated cleavage",
"children": [],
"size": 1
}
]
}
对于这个子树,它只有两个孩子为level1,所以返回数组应该是[[形成凋亡体,通过凋亡体介导的切割激活caspase]]
2
{
"dbId": "111471",
"name": "Apoptotic factor-mediated response",
"children": [
{
"dbId": "111461",
"name": "Cytochrome c-mediated apoptotic response",
"children": [
{
"dbId": "111458",
"name": "Formation of apoptosome",
"children": [],
"size": 1
},
{
"dbId": "111459",
"name": "Activation of caspases through apoptosome-mediated cleavage",
"children": [],
"size": 1
}
]
},
{
"dbId": "111469",
"name": "SMAC-mediated apoptotic response",
"children": [
{
"dbId": "111463",
"name": "SMAC binds to IAPs ",
"children": [],
"size": 1
},
{
"dbId": "111464",
"name": "SMAC-mediated dissociation of IAPcaspase complexes ",
"children": [],
"size": 1
}
]
}
]
}
对于此数据集,结果可能是
[ [细胞色素c介导的细胞凋亡反应,SMAC介导的细胞凋亡反应], [凋亡体的形成,通过凋亡体介导的切割激活半胱天冬酶,SMAC与IAP结合,SMAC介导的IAPcaspase复合物的解离] ]
现在,我正在尝试使用广度优先算法来执行第二个步骤。我知道效率不是很好。
谢谢!
答案 0 :(得分:0)
这应该可以解决问题,除非你处理大约1米节点或非常深的树,否则应该非常快:
var data={
//your data
}
var arr=[]; // array that holds an array of names for each sublevel
function traverse(data, level){
if(arr[level]==undefined) arr[level]=[]; // if its the first time reaching this sub-level, create array
arr[level].push(data.name); // push the name in the sub-level array
for(var index=0;index<data.children.length;index++){ // for each node in children
traverse(data.children[index], level+1); // travel the node, increasing the current sub-level
}
}
traverse(data, 0); // start recursive function
console.log(arr)