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

标签 javascript json loops parent-child

我有一个如下所示的 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 的 child 是:(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 排序,然后采用 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; }

关于javascript - 从树型对象数组Javascript中获取所有子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65233956/

相关文章:

java - 如何从 for 循环中按升序对数字进行排序?

javascript - 仅显示 # 个字词并隐藏其余字词,并可选择切换更多字词

javascript - 使用瑞典字符对数组键不区分大小写进行排序

javascript - 如何在 node.js 中的 http PUT 正文中使用 JSON?

javascript - 如何从 php json 编码生成这个 javascript 对象

javascript - 将 toJson R 对象转换为适合 d3.js 树布局的格式

php - 使用 Java 和 PHP 的 HTTP 发布消息

php循环记录集直到

javascript - 在 Javascript 中格式化数组循环的日期输出

javascript - 如何使用 RxJs 运算符进行递归 HTTP 调用?