从树类型 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; }
我有一个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; }