从树json数据中的子id获取所有父id

问题描述 投票:0回答:1

我需要来自树数据的对象数组列表,我可以在其中传递 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"
    
  }
]

以上数据是我需要所有家长的数据。

谢谢

我尝试了多种解决方案,但未能实现。

javascript arrays json tree typescript-typings
1个回答
0
投票

这是一个递归。很快我将详细说明算法,只是想阻止其他人回答......

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)

© www.soinside.com 2019 - 2024. All rights reserved.