Javascript 如何在数组对象中创建嵌套树

Javascript 如何在数组对象中创建嵌套树,javascript,arrays,algorithm,data-structures,nested-loops,Javascript,Arrays,Algorithm,Data Structures,Nested Loops,在数组对象数据之后: 使用Javascript数据结构,每当我使用数组对象的ID和父ID得到新的子数组时,我如何将数组对象迭代到子数组中 尝试使用javascript查找父Id和子嵌套根节点,但我无法找到如何将数组对象迭代到其子数组中。有人能帮我吗 var data = [ { id: 7, label: 'a', parentId: 2, childerns: [] }, { id: 7, label: 'm', parentId: 2, childerns: [] }, { i

在数组对象数据之后: 使用Javascript数据结构,每当我使用数组对象的ID和父ID得到新的子数组时,我如何将数组对象迭代到子数组中

尝试使用javascript查找父Id和子嵌套根节点,但我无法找到如何将数组对象迭代到其子数组中。有人能帮我吗

var data = [ 
  { id: 7, label: 'a', parentId: 2, childerns: [] },
  { id: 7, label: 'm', parentId: 2, childerns: [] },
  { id: 2, label: 'b', parentId: 5, childerns: [] },
  { id: 5, label: 'c', parentId: 20, childerns: [] },
  { id: 20, label: 'x', parentId: null, childerns: [] },
  { id: 8, label: 'd', parentId: 7, childerns: [] },
  { id: 9, label: 'n', parentId: 8, childerns: [] },
  { id: 9, label: 'n', parentId: 8, childerns: [] } ];```

and looking for the following nested tree pattern:

```var data = [
    {
        id: 20,
        label: 'x',
        parentId: null,
        childerns: [
            {
                id: 5,
                label: 'c',
                parentId: 20,
                childerns: [{
                    id: 2,
                    label: 'b',
                    parentId: 5,
                    childerns: [
                        {
                            id: 7, 
                            label: 'm',
                            parentId: 2,
                            childerns: [] 
                        },
                        {
                            id: 7,
                            label: 'a',
                            parentId: 2,
                            childerns: [{
                                id: 8,
                                label: 'd',
                                parentId: 7,
                                childerns: [
                                    {
                                        id: 9,
                                        label: 'n',
                                        parentId: 8,
                                        childerns: []
                                    },
                                    {
                                        id: 9,
                                        label: 'n',
                                        parentId: 8,
                                        childerns: []
                                    }
                                ]
                            }]
                        }]
                }]
            }]
    }];```


我喜欢下面的样式。首先,使用对象跟踪每个元素在原始数组中的位置。然后,遍历原始数组,将对当前元素的引用添加到其父数组中。如果parentId为null,则将元素添加到根。所有这些之后,根数组将包含完整的树

常数arr=[ {id:7,标签:'m',parentId:2,childerns:[]}, {id:2,标签'b',parentId:5,childerns:[]}, {id:5,标签为'c',parentId:20,childerns:[]}, {id:20,标签:'x',parentId:null,childerns:[]}, {id:8,标签'd',parentId:7,childerns:[]}, {id:9,标签:'n',parentId:8,childerns:[]}, {id:10,标签:'n',parentId:8,childerns:[]} ]; //将元素ID映射到arr索引 常数arrMap=arr.reduceac,el,i=>{ acc[el.id]=i; 返回acc; }, {}; 常数根=[]; //将每个元素推送到父数组的子数组 arr.forEachel=>{ 如果el.parentId==null{ 普氏根; }否则{ arr[arrMap[el.parentId].childerns.pushel; } };
根 我喜欢下面的样式。首先,使用对象跟踪每个元素在原始数组中的位置。然后,遍历原始数组,将对当前元素的引用添加到其父数组中。如果parentId为null,则将元素添加到根。所有这些之后,根数组将包含完整的树

常数arr=[ {id:7,标签:'m',parentId:2,childerns:[]}, {id:2,标签'b',parentId:5,childerns:[]}, {id:5,标签为'c',parentId:20,childerns:[]}, {id:20,标签:'x',parentId:null,childerns:[]}, {id:8,标签'd',parentId:7,childerns:[]}, {id:9,标签:'n',parentId:8,childerns:[]}, {id:10,标签:'n',parentId:8,childerns:[]} ]; //将元素ID映射到arr索引 常数arrMap=arr.reduceac,el,i=>{ acc[el.id]=i; 返回acc; }, {}; 常数根=[]; //将每个元素推送到父数组的子数组 arr.forEachel=>{ 如果el.parentId==null{ 普氏根; }否则{ arr[arrMap[el.parentId].childerns.pushel; } };
根 如果您正在寻找一种模式,其中子对象几乎可以无限扩展,那么应该使用类或构造函数,这样您就可以在其中传递另一个实例,如下面的UnitInstance.addChild方法所示

/*建造师*/ 功能单元ID、标签、子项{ this.id=id;this.label=label;this.parentId=null;this.children=[]; var t=这个; this.addChild=functionunitInstance{ unitInstance.parentId=this.id;this.children.pushunitInstance; 归还这个; } 如果儿童{ 儿童{ t、 阿迪奇洛; }; } this.getData=函数{ var c=[]; 这是我的孩子{ c、 pusho.getData; }; 返回{id:t.id,label:t.label,parentId:t.parentId,children:c}; } } var x=新单元20,'x',c=新单元5,'c',b=新单元2,'b',m=新单元7,'m';a=新单元7,'a',d=新单元8,'d',n=新单元9,'n'; x、 addChildc.addChildb.addChildm.addChilda.addChildd.addChildn.addChildn; var data=[x.getData];
控制台日志数据 如果您正在寻找一种模式,其中子对象几乎可以无限扩展,那么应该使用类或构造函数,这样您就可以在其中传递另一个实例,如下面的UnitInstance.addChild方法所示

/*建造师*/ 功能单元ID、标签、子项{ this.id=id;this.label=label;this.parentId=null;this.children=[]; var t=这个; this.addChild=functionunitInstance{ unitInstance.parentId=this.id;this.children.pushunitInstance; 归还这个; } 如果儿童{ 儿童{ t、 阿迪奇洛; }; } this.getData=函数{ var c=[]; 这是我的孩子{ c、 pusho.getData; }; 返回{id:t.id,label:t.label,parentId:t.parentId,children:c}; } } var x=新单元20,'x',c=新单元5,'c',b=新单元2,'b',m=新单元7,'m';a=新单元7,'a',d=新单元8,'d',n=新单元9,'n'; x、 addChildc.addChildb.addChildm.addChilda.addChildd.addChildn.addChildn; var data=[x.getData];
控制台日志数据;您缺少重复的数组对象,该对象重新运行两次。就像{id:7,标签:'a',parentId:2,childerns:[]},{id:7,标签:'m',parentId:2,childerns:[]}一样,我认为这是一个错误。当存在重复的数组对象时会发生什么?应该获取所有内容并创建一个嵌套数组。因此,如果有两个具有相同ID的父对象,那么子对象在哪里
去吗?在您的示例树中,为什么ID 8仅位于ID 7节点中的一个节点下而不位于另一个节点下?无论最后出现哪一个副本,我们都可以为其分配一个。您缺少重复的数组对象,该对象被重新运行了两次。就像{id:7,标签:'a',parentId:2,childerns:[]},{id:7,标签:'m',parentId:2,childerns:[]}一样,我认为这是一个错误。当存在重复的数组对象时,会发生什么情况?应该获取所有内容并创建一个嵌套数组。因此,如果有两个具有相同ID的父对象,那么子对象将去哪里?在您的示例树中,为什么ID 8仅位于ID 7节点的其中一个节点下而不位于另一个节点下?无论最后出现哪一个重复,我们都可以为其分配一个。我无法在每次接收新数据时硬编码嵌套每次接收新数据时,创建一个新单元,你可以将UnitInstance.getData推送到你的数据数组上。如果你在事件上这样做,那么它是动态的。我不能每次收到新数据时硬编码嵌套每次你收到新数据时,创建一个新单元,你可以将UnitInstance.getData推送到你的数据数组上。如果你在事件上这样做,那么它是动态的。