我需要来自树数据的对象数组列表,我可以在其中传递 id,它将返回对象数组。
任何人都可以帮我实现这个功能,我可以传递孩子ID,它将返回数据列表。
树 json 数据
[
{
"Id": 566,
"Name": "Root Cat Group 1",
"Cats": [
{
"Id": 1047,
"Name": "Abcd data one"
"CatGroupId": 566,
"ParentId": null,
"Children": [
{
"Id": 1053,
"Name": "Download SSRS",
"CatGroupId": 566,
"ParentId": 1047,
"Children": [
{
"Id": 1048,
"Name": "Send Email 1",
"CatGroupId": 566,
"ParentId": 1053,
"Children": [
{
"Id": 1049,
"Name": "Upload File 1",
"CatGroupId": 566,
"ParentId": 1048,
"Children": [
{
"Id": 1050,
"Name": "Call Rest API 1",
"CatGroupId": 566,
"ParentId": 1049,
"Children": [
]
}
]
}
]
}
]
}
]
}
],
"Children": [
{
"Id": 568,
"Name": "Child Cat Group 1",
"ParentId": 566,
"Cats": [
{
"Id": 1051,
"Name": "Down from man",
"CatGroupId": 568,
"ParentId": null,
"Children": [
{
"Id": 1052,
"Name": "Execute Proc",
"CatGroupId": 568,
"ParentId": 1051,
"Children": [
]
}
]
}
],
"Children": [
{
"Id": 569,
"Name": "Grand Child Cat Group 1",
"ParentId": 568,
"Cats": [
{
"Id": 1055,
"Name": "Transform Data",
"CatGroupId": 569,
"ParentId": null,
"Children": [
]
}
],
"Children": [
]
}
]
},
{
"Id": 570,
"Name": "Child Cat Group 2",
"ParentId": 566,
"Cats": [
{
"Id": 1054,
"Name": "Downl DAta",
"CatGroupId": 570,
"ParentId": null,
"Children": [
]
}
],
"Children": [
]
}
]
},
{
"Id": 567,
"Name": "Root Cat Group 2",
"ParentId": null,
"Cats": [
],
"Children": [
]
}
]
如果我选择或传递 id = 1052 ('执行过程') 那么 该函数将返回如下所示的对象数组(所有它的父数据)
[
{
"Id": 1047,
"Name" : "Abcd data one"
}
{
"Id": 1051,
"Name": "Down from man"
},
{
"Id": 1050,
"Name": "Call Rest API 1"
},
{
"Id": 1049,
"Name": "Upload File 1"
},
{
"Id": 1048,
"Name": "Send Email 1"
},
{
"Id": 1053,
"Name": "Download SSRS"
}
]
以上数据是我需要所有家长的数据。
谢谢
我尝试了多种解决方案,但未能实现。
这是一个递归。很快我将详细说明算法,只是想阻止其他人回答......
function findPath(node, id) {
var me = [{
Name: node.Name,
Id: node.Id,
}]
if (node.Id === id) {
return me
}
var keys = ['Children', 'Cats'];
for (var k = 0; k < keys.length; k++) {
var key = keys[k]
var children = node[key] || []
for (var i = 0; i < children.length; i++) {
var child = children[i]
var path = findPath(child, id)
if (path.length) {
return [me, ...path]
}
}
}
return [];
}
var data = [{
Id: 566,
Name: "Root Cat Group 1",
Cats: [{
Id: 1047,
Name: "Abcd data one",
CatGroupId: 566,
ParentId: null,
Children: [{
Id: 1053,
Name: "Download SSRS",
CatGroupId: 566,
ParentId: 1047,
Children: [{
Id: 1048,
Name: "Send Email 1",
CatGroupId: 566,
ParentId: 1053,
Children: [{
Id: 1049,
Name: "Upload File 1",
CatGroupId: 566,
ParentId: 1048,
Children: [{
Id: 1050,
Name: "Call Rest API 1",
CatGroupId: 566,
ParentId: 1049,
Children: []
}]
}]
}]
}]
}],
Children: [{
Id: 568,
Name: "Child Cat Group 1",
ParentId: 566,
Cats: [{
Id: 1051,
Name: "Down from man",
CatGroupId: 568,
ParentId: null,
Children: [{
Id: 1052,
Name: "Execute Proc",
CatGroupId: 568,
ParentId: 1051,
Children: []
}]
}],
Children: [{
Id: 569,
Name: "Grand Child Cat Group 1",
ParentId: 568,
Cats: [{
Id: 1055,
Name: "Transform Data",
CatGroupId: 569,
ParentId: null,
Children: []
}],
Children: []
}]
}, {
Id: 570,
Name: "Child Cat Group 2",
ParentId: 566,
Cats: [{
Id: 1054,
Name: "Downl DAta",
CatGroupId: 570,
ParentId: null,
Children: []
}],
Children: []
}]
}, {
Id: 567,
Name: "Root Cat Group 2",
ParentId: null,
Cats: [],
Children: []
}];
const tree = {
Id: "Root",
Name: "Root",
Children: data
}
const path = findPath(tree, 1052)
console.log(path)