首页 > 其他分享 >递归遍历树形结构,查找目标元素

递归遍历树形结构,查找目标元素

时间:2023-11-15 16:55:18浏览次数:37  
标签:遍历 const name 递归 children item 树形 IMenuItem id

树形结构的数据,即源数据:

const origin =
{
  "id": "40953897304457339",
  "name": "一级单位",
  "children": [
    {
      "id": "52979376890839070",
      "name": "二级单位1",
      "children": null
    },
    {
      "id": "42225681513316475",
      "name": "二级单位2",
      "children": null
    },
    {
      "id": "41822511372960975",
      "name": "二级单位3",
      "children": null
    },
    {
      "id": "40924378111672443",
      "name": "二级单位4",
      "children": [
        {
          "id": "40927544324653179",
          "name": "三级单位41",
          "children": null
        },
        {
          "id": "40927281190797435",
          "name": "三级单位42",
          "children": [
            {
              "id": "40920270965309563",
              "name": "四级单位421",
              "children": [
                {
                  "id": "40922872926961787",
                  "name": "五级单位4211",
                  "children": null
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

要查找的元素,已知id,即目标数据id:40922872926961787

实现代码:

1. 仅返回匹配到的元素;

// IMenuItem 仅是对数据结构的定义,可自行处理,或者使用any代替
const findCompanyViaId = (id: string, list: IMenuItem[]): any => {
   // 防止更改源数据
  const copayList: IMenuItem[] = JSON.parse(JSON.stringify(list));
  let company: IMenuItem | undefined = undefined;
  for (let i = 0; i < copayList.length; i++) {
    const item = copayList[i];
    if (item.id === id) {
      return item;
    }
    if (item.children && item.children.length>0){
      company = findCompanyViaId(id, item.children);
      return company;
    }
  }
};


findCompanyViaId(40922872926961787, origin);
// 返回结果
{
  "id": "40922872926961787",
  "name": "五级单位4211",
  "children": null
}

2.  返回匹配到的元素及其路径上的所有元素;

// IMenuItem 仅是对数据结构的定义,可自行处理,或者使用any代替
const findCompanyTreeViaId = (id: string, list: IMenuItem[]): any => {
   // 防止更改源数据
  const copayList: IMenuItem[] = JSON.parse(JSON.stringify(list));
  const companyTree: IMenuItem[] = [];
  for (let i = 0; i < copayList.length; i++) {
    const item = copayList[i];
    if (item.id === id) {
      return item;
    } else if (item.children) {
      const company = findCompanyTreeIdViaId(id, item.children);
      item.children = company;
      return item;
    }
  }
};


findCompanyTreeViaId(40922872926961787, origin);
// 返回结果
{
  "id": "40953897304457339",
  "name": "一级单位",
  "children": [
    {
      "id": "40924378111672443",
      "name": "二级单位4",
      "children": [
        {
          "id": "40927281190797435",
          "name": "三级单位42",
          "children": [
            {
              "id": "40920270965309563",
              "name": "四级单位421",
              "children": [
                {
                  "id": "40922872926961787",
                  "name": "五级单位4211",
                  "children": null
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

3. 在2基础上的变形, 返回匹配到的元素及其路径上的所有元素的id;

// IMenuItem 仅是对数据结构的定义,可自行处理,或者使用any代替
const findCompanyTreeIdsViaId = (id: string, list: IMenuItem[]): any => {
   // 防止更改源数据
  const copayList: IMenuItem[] = JSON.parse(JSON.stringify(list));
  const companyTreeIds: string[] = [];
  for (let i = 0; i < copayList.length; i++) {
    const item = copayList[i];
    if (item.id === id) {
      return [item.id];
    } else if (item.children) {
      const companyId = findCompanyTreeIdViaId(id, item.children);
      companyId && companyTreeIds.push(item.id, companyId);
      return companyTreeIds;
    }
  }
};


findCompanyTreeIdsViaId(40922872926961787, origin);
// 返回结果
["40953897304457339",["40924378111672443",["40927281190797435",["40920270965309563",["40922872926961787"]]]]]
// 可以通过Array.flat()方法将多维数组扁平化,具体用法参考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
// 将上述结果赋值给arr
arr.flat(Infinity);
// 结果
["40953897304457339","40924378111672443","40927281190797435","40920270965309563","40922872926961787"]

 

标签:遍历,const,name,递归,children,item,树形,IMenuItem,id
From: https://www.cnblogs.com/shellon/p/17834215.html

相关文章

  • 实验九 图的创建与遍历
    实验时间:第11周实验目的:掌握图的邻接矩阵、邻接表两种存储结构,能够实现在任意一种存储结构上的创建和遍历两种基本操作实验要求:1、认真阅读和掌握教材上和本实验相关内容和算法(见P161~170)。2、上机将图的任意一种存储表示的创建和遍历(DFS和BFS至少实现一种)算法实现。3、实......
  • 【随手记】mybatis动态sql foreach遍历List<Map>问题
    使用mybatis时经常需要在xml里写动态sql,发现foreach标签使用的问题foreach标签使用当Mapper传参是List<Map<String,Object>集合的形式时,不能直接使用参数名,会找不到对应的参数。list类型的参数会特殊处理封装在map中,map的key就叫list所以collection属性值只能是"list"//m......
  • Map遍历删除元素的几种方法
    2哥 :3妹,今天是周末,又不用上班,干嘛看着不开心的样子啊?3妹:你没有看昨天的新闻吗,昨天国家痛失了两位重要人物。2哥:哎,看到了,生老病死,也是没有办法。唯愿逝者安息,生者坚强!我们能做的,就是更加坚强,好好学习,建设祖国!3妹:好吧。2哥:还记得我们之前学习的:list遍历时删除元素的方法 吗,那如......
  • [左神面试指南] 递归和动态规划[下]篇
    CD42子数组异或和为0的最多划分⭐/*⭐DP⭐*/publicclassCD42_1{publicstaticintsolution(int[]arr){HashMap<Integer,Integer>map=newHashMap<>();int[]dp=newint[arr.length];inttemp=0;dp[0]=arr[0]......
  • 使用hutool工具包对集合中的数据组装成树形的结构
    //配置Listlist=newArrayList<>();TreeNodeConfigtreeNodeConfig=newTreeNodeConfig();//指定节点字段的名称和父级节点的字段名称treeNodeConfig.setIdKey("id");treeNodeConfig.setParentIdKey("pid");//最大递归深度treeNodeConfig.setDeep(3);//对集合中的......
  • netcore net 递归查询示例
    ///<summary>///查询项目列表///</summary>///<paramname="userModel"></param>///<returns></returns>publicasyncTask<List<GetProjectListOutput>>GetProjectList......
  • 树形/级联组件->数据做键,制作与还原
    数据的制作/**树形/级联组件->数据做键,制作与还原*@param{Array}list*@param{string}params源`json`的`key`*@param{string}key生成后`string`存放的`key`*@param{string}children下一级的`key`值*@returns*/exportconstTreeValueToKe......
  • SQLserver中的递归如何实现
    在SQLServer中,可以使用递归CTE(通用表达式)来实现递归查询。CTE(通用表达式)是一种临时命名结果集,它只存在于查询语句的执行过程中。CTE可以在一个SELECT,INSERT,UPDATE或DELETE语句中使用,并且可以在同一个查询中递归引用自身。这使得递归查询成为可能。下面是一个使用递归CTE的示例:......
  • [左神面试指南] 递归和动态规划[上]篇
    CD183斐波那契数列问题的递归和动态规划1/**矩阵快速幂*[f(n),f(n-1)]=[1,1]x[[1,1],[1,0]]^(n-2)*/publicclassCD183_1{publicstaticlongsolution(longn){if(n<1)return-1;if(n<=2)return1;long[][]......
  • 用函数递归打印数字的每位数字
    #include<stdio.h>voidprint(intj){  if(j>9)  {        print(j/10);      }  printf("%d",j%10);}intmain(){ inti; printf("请输入数字:"); scanf_s("%d",&i);   print(i); ......