你还不懂递归么?不允许你不懂,进来折腾下自己吧

news2025/6/25 16:35:44

举例数组

const arr = [
{id: "1175310929766055936", pid: "",  name: "总裁办" },'---返回空数组',
{id: "1175311213774962688", pid: "",  name: "行政部" },'---返回空数组',
{id: "1175311267684352000", pid: "",  name: "人事部" },'---返回空数组',
{id: "1175311325720936448", pid: "",  name: "财务部" },
{id: "1175311373083017216", pid: "",  name: "技术部" },
{id: "1175311418004013056", pid: "",  name: "运营部" },
{id: "1175311466846683136", pid: "",  name: "市场部" },
{id: "1235395178363559936", pid: "1175311325720936448",  name: "财务核算部"},
{id: "1235398264104624128", pid: "1175311325720936448",  name: "税务管理部"},
{id: "1235398536969265152", pid: "1175311325720936448",  name: "薪资管理部"},
{id: "1235398608847052800", pid: "1175311373083017216",  name: "Java研发部"},
{id: "1235398661355544576", pid: "1175311373083017216",  name: "Python研发部"},
]

递归

 第一次进入递归

数组内下标0的对象,的pid和设置的默认pid全等,符合if判断

进入if内执行代码

并触发递归

{id: "1175310929766055936", pid: "",  name: "总裁办" } 的id被传参--作为pid    arr数组也被传入

此时进入递归

再次判断--内部有循环, 将依次拿到数组内的每个对象的pid

和{id: "1175310929766055936", pid: "",  name: "总裁办" }的id(递归函数内是pid)进行判断,

12个对象的pid 和{id: "1175310929766055936", pid: "",  name: "总裁办" }都不全等,return空数组

此时递归函数被销毁

{id: "1175310929766055936", pid: "",  name: "总裁办" }在外部函数被push到newArr内

然后进入第二次循环,forEach会执行12次(和双循环有异曲同工之妙,函数自己调用自己,进入递归,外部调用一次(此时外部循环走第一次)。递归函数内的循环会执行12次)(这不就是双循环么,外部走一次,内部走多次)

前三个对象进入了一层递归,但是返回了空数组,因为都不符合条件

每次递归函数每次创建使用完毕都会被销毁,再次递归里面的const newArr =[ ] 就被重新创建了,生成空数组(这里容易与外部const newArr =[]容易弄混,外部的const newArr =[]内是有被push内容的),递归调用自己的话,就是创建了一个和自己一模一样的函数,相当于一个新函数(长得一样而已)

跳过前三个---直接来到遍历下标3的对象

 这里比前面复杂,递归内,再次进入递归,初始函数调用进入递归

递归内符合条件,再次进入里递归,进入二层递归

图中已经画出,进行非常详细的分析

初始函数

遍历得到下标3的对象    {id: "1175311325720936448", pid: "",  name: "财务部" }

  {id: "1175311325720936448", pid: "",  name: "财务部" }的pid和初始的pid= ‘ ’ 全等进入if内

{id: "1175311325720936448", pid: "",  name: "财务部" }的id被传入递归函数的形参pid里

arr就是原数组对象

再看递归--函数内

循环arr 拿到每一个对象并把每个对象的pid 和 {id: "1175311325720936448", pid: "",  name: "财务部" }的id进行对比

此时第一个符合条件下标 7 的对象{id: "1235395178363559936", pid: "1175311325720936448",  name: "财务核算部"}

会进入再次进入if判断

进入二层--递归

{id: "1235395178363559936", pid: "1175311325720936448",  name: "财务核算部"}的id将会被再次传入 进入递归,直接说结果把,二层递归return会返回空数组   

现在回到一层递归里

给{id: "1235395178363559936", pid: "1175311325720936448",  name: "财务核算部"}加上children

并push到 const newArr =[]里(此处是递归里的 const newArr =[])。然后return

回到初始函数内

[ {id: "1235395178363559936", pid: "1175311325720936448",  name: "财务核算部" ,children:[] } ]被return  到初始函数内 并被赋值给children

 初始函数还停在这个对象 {id: "1175311325720936448", pid: "",  name: "财务部" }=item

往下走

item.children = children

得到结果

{id: "1175311325720936448", pid: "",  name: "财务部" ,children:[

{id: "1235395178363559936", pid: "1175311325720936448",  name: "财务核算部"}                            ]  }

并被push到 newArr

外部的     const newArr 所有的数据     push后的结果

const newArr =[

{id: "1175310929766055936", pid: "",  name: "总裁办" },

{id: "1175311213774962688", pid: "",  name: "行政部" },

{id: "1175311267684352000", pid: "",  name: "人事部" },

{id: "1175311325720936448", pid: "",  name: "财务部" ,children:[

{id: "1235395178363559936", pid: "1175311325720936448",  name: "财务核算部"}                            ]  }

]

后面就都是都是重复这些步骤

--------------------------------------------------------------------

代码还可以优化

上面写法也可以实现效果

但是所有对象都被加上children空数组,

在里面再加上一个判断

 if(children.length > 0){


        item.children=children
      }

只有,有子级部门才会添加children数组

不加判断的效果

 加上

if(children.length > 0){
        item.children=children
      }

后的效果

 全部分析完毕

最终实现代码

  const arr = [
{id: "1175310929766055936", pid: "",  name: "总裁办" },
{id: "1175311213774962688", pid: "",  name: "行政部" },
{id: "1175311267684352000", pid: "",  name: "人事部" },
{id: "1175311325720936448", pid: "",  name: "财务部" },
{id: "1175311373083017216", pid: "",  name: "技术部" },
{id: "1175311418004013056", pid: "",  name: "运营部" },
{id: "1175311466846683136", pid: "",  name: "市场部" },
{id: "1235395178363559936", pid: "1175311325720936448",  name: "财务核算部"},
{id: "1235398264104624128", pid: "1175311325720936448",  name: "税务管理部"},
{id: "1235398536969265152", pid: "1175311325720936448",  name: "薪资管理部"},
{id: "1235398608847052800", pid: "1175311373083017216",  name: "Java研发部"},
{id: "1235398661355544576", pid: "1175311373083017216",  name: "Python研发部"},
]

  function treeArr(arr , pid=''){
  const newArr =[]

  arr.forEach(item => {

    if(item.pid === pid){
      const children = treeArr(arr , item.id) 

      if(children.length > 0){
        item.children=children
      }
     newArr.push(item)
    }
  });
  
    return newArr
}
 
  console.log( treeArr(arr));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

随想录一刷Day27——回溯算法

文章目录Day27_回溯算法13. 子集 II14. 491.递增子序列15. 全排列全排列 IIDay27_回溯算法 13. 子集 II 90. 子集 II class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startI…

[SwiftUI 开发] Widget 小组件

小组件简述 小组件可以在主屏幕上实现内容展示和功能跳转。 系统会向小组件获取时间线&#xff0c;根据当前时间对时间线上的数据进行展示。点击正在展示的视觉元素可以跳转到APP内&#xff0c;实现对应的功能。 小组件是一个独立于 App 环境(即 App Extension)&#xff0c;小…

谷粒学院——第二十一章、spring security详细

一、Spring Security介绍 1、Spring Security简介 Spring 是非常流行和成功的 Java 应用开发框架&#xff0c;Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。 正如你可能知道的关于安全…

年度征文|2022年「博客之星」,花落谁家? 大家来竞猜吧

一年一度的「博客之星」大赛如火如荼地进行着&#xff0c;大家都忙着评分、发帖、回帖.....今天发现我在分组的排名只有40多名&#xff0c;基本上算是放弃了。但是&#xff0c;看到本文的朋友&#xff0c;还是可以帮我拉拉票的&#xff01;请点开链接给个五星评分&#xff1a; …

CentOS服务器署Springboot的java项目最简单操作步骤

CentOS服务器署Springboot的java项目最简单操作步骤 准备工作 1.首先本地有一个能跑起来正常的 java 项目的 jar 包; 2.有一个前端项目, 可以仅是一个 index.html 文件; 3.需要备案好的域名 (可选, 否则只能 ip 访问) 4.购买阿里云或者腾讯云等等任意 CentOS 服务器一个 1. 获…

(机器学习深度学习常用库、框架|Pytorch篇)第(待定)节:卷积神经网络CNN中一些经典网络结构写法

文章目录一&#xff1a;LeNet-5二&#xff1a;AlexNet三&#xff1a;VGG四&#xff1a;ResNet五&#xff1a;MobileNetV1六&#xff1a;InceptionNet一&#xff1a;LeNet-5 LeNet-5&#xff1a;LeNet-5是一个较简单的卷积神经网络。下图显示了其结构&#xff1a;输入的二维图像…

ansible通过多种方法配置yum源仓库

目录 1.挂载本地光盘到/mnt ​2.配置yum源仓库文件通过多种方式实现 仓库1 &#xff1a;Name: RH294_BaseDescription&#xff1a; RH294 base softwareBase urt: file:///mnt/BaseOS不需要验证钦件包 GPG 签名启用此软件仓库 ​编辑仓库 2:Name: RH294_StreamDescription &…

第四十二篇 nextTick

在前面封装swiper组件当中&#xff0c;通过许多种方式方法&#xff0c;其一从mounted初始化过早转到updated后出现初始化重复&#xff0c;再者通过设置key值和使用v-if控制swiper组件&#xff0c;然后通过Vue.diretive自定义指令的方式来封装swiper组件&#xff0c;那么本篇的n…

排序算法之快速排序

目录 排序算法介绍 快速排序 算法流程 算法实现 python C 快排为什么快 算法优化 基准数优化 python C 尾递归优化 python C 排序算法介绍 《Hello算法》是GitHub上一个开源书籍&#xff0c;对新手友好&#xff0c;有大量的动态图&#xff0c;很适合算法初学者自…

Struts2框架标签

Struts2框架标签1、前言2、UI标签2.1、表单标签2.1、非表单标签3、通用标签4、例子4.1、实体类User4.2、控制器UserAction4.3、配置文件struts.xml4.4、页面users.jsp4.5、测试1、前言 Struts2有丰富的tag标签可以使用&#xff0c;即Struts2的标签库&#xff0c;如果能够灵活运…

彻底理解动态规划:编辑距离

本篇的题目非常经典&#xff0c;几乎是面试必备&#xff0c;即&#xff0c;编辑距离问题&#xff0c;edit distance&#xff1b; 给定两个字符串word1以及word2&#xff0c;返回将word1转为word2需要的最少步骤&#xff0c;在每一步中你可以针对字符串word1进行以下操作&#…

技术开发115

技术开发115 业务内容&#xff1a; 拖车用辅助脚、拖车用零件类、特殊车辆用车轴Sub。Assy产品、面向汽车产业的生产设备、面向建设机械的零部件类、面向汽车产业的检查夹具 公司简介&#xff1a; 董事长&#xff1a;佐藤安弘 资本金&#xff1a;4500万日元 员工数&#x…

shell第五天练习

题目&#xff1a; 1、编写函数&#xff0c;实现打印绿色OK和红色FAILED&#xff0c;判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED 2、编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误 3、编写函数实现两个数字做为参数…

聊聊前端安全之CSRF

本文作者为奇舞团前端开发工程师一、什么是CSRFCSRF&#xff08;Cross Site Request Forgery&#xff0c;跨站域请求伪造&#xff09;&#xff0c;通常缩写为 CSRF。CSRF攻击是攻击者通过伪装成受信任用户向服务器发起各种请求&#xff0c;达到欺骗服务器接收并执行指令&#x…

【数据结构】顺序表

【本篇内容】线性表顺序表线性表线性表是n个具有相同特性的数据元素的有限序列。常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串......线性表在逻辑上是线性结构&#xff0c;但是在物理结构上并一定是连续的&#xff0c;线性表在物理上存储时&#xff0c;通常是以数组…

保证原子性的几种方式,你都知道吗???

1. 前言 今天主要是从实战 浅谈原理的角度来说下&#xff0c;并发线程下原子性的几种处理方式&#xff0c;好了废话不多说了&#xff0c;接下来让我们看看吧 2. 开始 在开始之前需要提问下大家, 代码i ; 能保持原子性吗&#xff1f;&#xff1f;&#xff1f; 是不是一句话就执…

C++——命名空间,输入输出,缺省参数

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;数据结构——二叉树 &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;补充C语言…

Java 诊断利器 Arthas JVM命令

一、jvm 相关命令介绍 命令说明dashboard当前系统的实时数据面板getstatic查看类的静态属性heapdumpdump java heap, 类似 jmap 命令的 heap dump 功能jvm查看当前 JVM 的信息logger查看和修改 loggermbean查看 Mbean 的信息memory查看 JVM 的内存信息ognl执行 ognl 表达式per…

【Android春招】Android基础day2

一、填空题 1&#xff0e;除了开启开发者选项之外&#xff0c;还需打开手机上的 _ 开关&#xff0c;然后才能在手机上调试App。 USB调试 2&#xff0e;App开发的两大技术路线包括 _和混合开发。 原生开发 3&#xff0e;App工程的编译配置文件名为 _。 build.gradle 4&#xff0…

挂载光盘,配置yum源并且安装http软件包 ansible(4)

目录 一、挂载本地光盘到/mnt 二、配置yum源 一、挂载本地光盘到/mnt 第一步&#xff1a; 使用mount模块 注&#xff1a;fstype代表文件格式 二、配置yum源 第一种方法&#xff1a; 使用yum_repository模块 检验是否有对应文件在受控主机node1受控主机&#xff1a;node2受控…