gpt4 book ai didi

javascript 将层次树拆分为所有子树,并按级别对每个子树的节点进行分组

转载 作者:行者123 更新时间:2023-12-03 11:34:13 24 4
gpt4 key购买 nike

我有一个层次结构数据,可以将其视为树结构。

第一

我需要将这个层次树拆分为子树并获取所有子树。下面的功能是我做的,效果很好

            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 中。

那么我应该为第二个流程做什么?

有没有更有效的方法来完成整个过程?

因为我的数据集有点大,大约有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 的两个子树,因此返回数组应该是 [[Formation of apoptosome,Activation of caspase through apoptosome-induced cleavage ]]

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介导的凋亡 react ,SMAC介导的凋亡 react ], [凋亡体的形成,通过凋亡体介导的裂解激活Caspase,SMAC与IAP结合,SMAC介导的IAPCaspase复合物解离]]

现在,我尝试使用广度优先算法来执行第二步骤。我知道效率不是很好。

谢谢!

最佳答案

这应该可以解决问题,除非您正在处理大约 1m 个节点或非常深的树,否则应该相当快:

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)

完整 fiddle :http://jsfiddle.net/juvian/fmhrpdbf/1/

关于javascript 将层次树拆分为所有子树,并按级别对每个子树的节点进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26595966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com