从树类型 object 数组 Javascript 中获取所有 Child 记录

Get All The Child Record from a tree type object array Javascript

我有一个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
   }
]

现在我想得到所有的child of id=2 or 3

例如: id 2 的 childrens 是:(4,5) 3: id 2 的 childrens 是:(6,7,8)

如何获取全部child记录

我尝试使用 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 排序,然后使用 id 通过递归查找子节点和嵌套子节点。

const
    getChildren = id => (relations[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 }],
    relations = data.reduce((r, o) => {
        (r[o.parentId] ??= []).push(o);
        return r;
    }, {});

console.log(getChildren(2)); // 4 5
console.log(getChildren(3)); // 6 7 8
.as-console-wrapper { max-height: 100% !important; top: 0; }