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

javascript将层次结构树拆分为所有子树,并按其级别对每个子树的节点进行分组,javascript,algorithm,tree,Javascript,Algorithm,Tree,我有一个层次结构的数据,可以被视为一个树结构 首先 我需要将这个层次结构树拆分成子树,然后得到所有的子树。 下面的函数就是我所做的,它工作得很好 var hierarchObjects = []; traverseNodes(root); function traverseNodes(root){ hierarchObjects.push(root); for(

我有一个层次结构的数据,可以被视为一个树结构

首先

我需要将这个层次结构树拆分成子树,然后得到所有的子树。 下面的函数就是我所做的,它工作得很好

            var hierarchObjects = [];
            traverseNodes(root);
            function traverseNodes(root){
                hierarchObjects.push(root);
                for(var i=0; i<root.children.length; ++i)
                {
                    traverseNodes(root.children[i]);
                }
            }
对于这个子树,它只有两个1级的子级,因此返回数组应该是[[凋亡小体的形成,通过凋亡小体介导的裂解激活半胱天冬酶]]

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与IAPs结合,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)
var数据={
//你的数据
}
var arr=[];//包含每个子级别的名称数组的数组
函数遍历(数据、级别){
如果(arr[level]==未定义)arr[level]=[];//如果是第一次到达此子级别,请创建数组
arr[level].push(data.name);//在子级别数组中推送名称

对于(var index=0;indexc你能举一个根对象和所需输出的例子吗?@juvian补充一下,谢谢这样的方法?:谢谢,虽然速度仍然很慢,但WBFS只在每个节点上运行一次,它的主要问题是需要内存,所以没有理由比它快一次。另外,至少在我的浏览器中,生成输出需要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)