Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从树型对象数组获取所有子记录_Javascript_Json_Loops_Parent Child - Fatal编程技术网

Javascript 从树型对象数组获取所有子记录

Javascript 从树型对象数组获取所有子记录,javascript,json,loops,parent-child,Javascript,Json,Loops,Parent Child,我有一个JSON数据,如下所示 var data = [ { "id":1, "parentId":0 }, { "id":2, "parentId":1 }, { "id":3, "parentId":1 }, { "id":4,

我有一个JSON数据,如下所示

var data =
[
   {
      "id":1,
      "parentId":0
   },
   {
      "id":2,
      "parentId":1
   },
   {
      "id":3,
      "parentId":1
   },
   {
      "id":4,
      "parentId":2
   },
   {
      "id":5,
      "parentId":4
   },
   {
      "id":6,
      "parentId":3
   },
   {
      "id":7,
      "parentId":6
   },
   {
      "id":8,
      "parentId":7
   }
]
现在我想得到id=2或3的所有子对象

例如: id为2的儿童为:(4,5) 对于3: id为2的儿童是:(6,7,8)

我怎样才能得到所有的儿童记录

我尝试使用for循环,但失败了。下面是我的工作

这里ArrFolderTree=数据

            let parentId = [];
            let arrAdminFolder = [];
            for (let i = ArrFolderTree.length - 1; i > 0; i--) {
                let ind = 0;
                while (ind < ArrFolderTree.length) {
                    for (let o = 0; o < ArrAllFolders.length; o++) {
                        if (ArrAllFolders[o].FolderId == ArrFolderTree[ind].Id) {
                            parentId.push(ArrFolderTree[ind].Id);
                            arrAdminFolder.push(ArrFolderTree[ind].Id);
                        }
                        let currentParentId = 0;
                        for (let ab = 0; ab < parentId.length; ab++) {
                            if (parentId[ab] == ArrAllFolders[o].FolderId) {
                                currentParentId = ArrFolderTree[ind].Id;
                                arrAdminFolder.push(ArrFolderTree[ind].Id);
                            }
                        }
                        if (currentParentId > 0)
                            parentId.push(currentParentId);
                    }
                    ind++;
                }
            }
让parentId=[];
让ArradInfolder=[];
for(设i=ArrFolderTree.length-1;i>0;i--){
设ind=0;
while(ind0)
parentId.push(当前parentId);
}
ind++;
}
}

上面的循环是错误的,但我想知道如何在这里使用循环。您可以使用一个对象,其中所有节点都按其
父id
排序,然后使用
id
通过递归查找子节点和嵌套子节点

const
getChildren=id=>(关系[id]| |[]).flatMap(o=>[o,…getChildren(o.id)]),
data=[{id:1,parentId:0},{id:2,parentId:1},{id:3,parentId:1},{id:4,parentId:2},{id:5,parentId:4},{id:6,parentId:3},{id:7,parentId:6},{id:8,parentId:7}],
关系=数据。减少((r,o)=>{
(r[o.parentId]??=[])。推送(o);
返回r;
}, {});
console.log(getChildren(2));//4 5
console.log(getChildren(3));//6 7 8

.as console wrapper{max height:100%!important;top:0;}
这里的结果的预期格式是什么?我只想在控制台中打印任何格式都很有用,比如逗号分隔的字符串或数组