【前端开发】JS Vue React中的通用递归函数

在这里插入图片描述

文章目录

  • 前言
  • 一、递归函数的由来
  • 二、功能实现
    • 1.后台数据
    • 2.处理数据
    • 3.整体代码
  • 总结


前言

大家好,今天和大家分享一下在前端开发中js,vue,react的通用递归方法。
递归是指一个函数在执行过程中调用自身的行为。通过递归,可以将一个复杂的问题拆解成多个子问题,并通过解决子问题来解决原始问题。递归在编程中非常常见,特别是在解决树型结构或者需要进行重复操作的情况下。

一、递归函数的由来

递归函数的由来可以追溯到数学中的递归概念和数学归纳法。
在数学中,递归是指通过定义基本情况和递推公式,将一个问题分解为更简单的、与原问题具有相同结构的子问题,并用子问题的解来构建原问题的解。递归的思想在解决一些数学问题时非常有用。
当计算机科学发展起来后,人们将递归思想应用到程序设计中,形成了递归函数的概念。递归函数是一种能够调用自身的函数。 递归函数的使用可以有效地解决一些需要重复执行相似任务或处理具有递归结构的问题。

递归函数的设计通常包括两部分:
基本情况(边界条件):定义问题的最简单情况和对应的解,作为递归的终止条件。
递推公式(递归关系):描述问题和子问题之间的联系,通过递归调用函数本身来解决规模较小的子问题。
递归函数的执行过程中,每次调用都会创建一个新的函数上下文(包括参数、局部变量等),并将其压入执行栈。递归函数通过不断调用自身,并处理更小规模的子问题,直到达到基本情况为止,然后逐步返回结果,并依次弹出执行栈中的上下文,完成整个递归过程。

递归函数在实际编程中有广泛的应用,例如树的遍历、图的搜索、排列组合、动态规划等领域。但需要注意的是,递归函数的设计要合理,避免无限递归或重复计算,以确保程序的正确性和效率。

二、功能实现

1.后台数据

下面的数据是一个假数据,相当于接口数据,大家写的时候接口有数据就直接获取就好。

数据结构: 每个元素都具有 id、pid、title 和 money 属性,其中 id 是每个元素的唯一标识,pid 是父级元素的 id,title 是该元素的标题,money 是一些金额。

var temp = [{"id": 1,"pid": 0,"title": "一档","money": "666.00"
},
{"id": 2,"pid": 0,"title": "二档","money": "1900.00"
},
{"id": 9,"pid": 1,"title": "一档1级","money": "1800.00"
},
{"id": 3,"pid": 0,"title": "三档","money": "2000.00"
},
{"id": 4,"pid": 0,"title": "四档","money": "2200.00"
},
{"id": 6,"pid": 4,"title": "四档1级","money": "2200.00"
},
{"id": 7,"pid": 2,"title": "二档1级","money": "3700.00"
},
{"id": 8,"pid": 3,"title": "三档1级","money": "2000.00"
}
]

2.处理数据

递归构建树: 函数 getTree(list, pid, data) 被调用时,它的目标是在 data 数组中构建一个树状结构。参数 list 是原始数据数组,pid 是当前节点的父级 ID,data 是用来存储构建的树状结构的数组。

//处理好的数据
let res = getTree(temp,0,[]);
console.log(res);	//控制台打印

先获取到所有的数据
获取一级节点: 使用 for…of 循环遍历原始数据 list,查找所有父级 ID 等于当前 pid 的元素,然后将这些元素添加到 data 数组中,这些元素就成为了一级节点。
获取子级节点: 对于每个一级节点,使用 for…of 循环遍历 data,为每个一级节点添加一个空数组 children,然后再次调用 getTree 函数,将当前一级节点的 id 作为新的 pid,并传入该一级节点的 children 数组。

//处理数据方法
function getTree(list,pid,data){//获取所有一级for(let item of list){if(item.pid == pid){ata.push(item);}}return data;
}

获取二级及三级数据
删除空的 children 属性: 在每个一级节点的循环中,如果它没有子级节点(即 children 数组为空),则删除该属性,以使最终结果更清晰。

//获取子级for(let i of data){i.children = [];getTree(list,i.id,i.children);//递归调用if(i.children.length == 0){delete i.children;}}

返回树状数据结构: 函数返回构建好的树状结构,即 data 数组,其中每个元素都带有 children 属性,表示它的子级节点。
日志输出: 最后,你使用 console.log(res) 将构建好的树状结构打印到控制台。

3.整体代码

//处理好的数据let res = getTree(temp,0,[]);console.log(res);//打印观察//处理数据方法function getTree(list,pid,data){//获取所有一级for(let item of list){if(item.pid == pid){data.push(item);}}//获取子级for(let i of data){i.children = [];getTree(list,i.id,i.children);//递归调用if(i.children.length == 0){delete i.children;}}return data;}

总结

需要注意的是,递归函数在实际应用中需要注意性能和空间占用,不当的使用可能会导致栈溢出等问题。在编写递归函数时,要确保问题可以通过有限次数的递归调用得到解决,并且考虑如何优化递归算法,避免不必要的重复计算。
以上就是本章的全部内容了,希望这篇文章能够帮助到您,感谢您的阅读。
在这里插入图片描述

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

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

相关文章

特殊矩阵的压缩存储(对称矩阵,三角矩阵和三对角矩阵)

目录 1.对阵矩阵 2.三角矩阵 3.三对角矩阵(带状矩阵) 均假设数组的下标从0开始 1.对阵矩阵 定义:若对一个n阶矩阵A中的任意一个元素 aᵢ,ⱼ 都有aᵢ,ⱼaⱼ,ᵢ (1≤i,j≤n),则称其为对称矩阵。 存储策略…

Cookie、Session和Token三者区别以及各自应用场景

一、三者区别 存储位置:Session和Cookie分别存储在服务器端和客户端,而Token则是在客户端和服务器端之间传递的。安全性:Session相对于Cookie来说更安全,因为Session存储在服务器端,不容易被恶意攻击者获取。而Cookie…

在C/C++中使用vcpkg

文章目录 介绍vcpkg 入门安装vcpkg为您的项目安装库将 vcpkg 与 CMake 结合使用 介绍 如今,现代语言(例如Go)通常提供集成的包管理来提取库的所有依赖项。然而,许多软件都是用 C/C 创建和维护的,并且没有现成的包管理…

【canal系】canal集群异常Could not find first log file name in binary log index file

这里先说明下这边使用的canal版本号为1.1.5 在描述这个问题之前,首先需要简单对于canal架构有个基本的了解 canal工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议MySQL master 收到 dum…

【精读Uboot】SPL阶段的board_init_r详细分析

对于i.MX平台上的SPL来说,其不会直接跳转到Uboot,而是在SPL阶段借助BOOTROM跳转到ATF,然后再通过ATF跳转到Uboot。 board_init_f会初始化设备相关的硬件,最后进入board_init_r为镜像跳转做准备。下面是board_init_r调用的核心函数…

C++ 多线程

目录 目录 多线程的创建与执行 多线程的互斥 1. 创建一个mutex对象&#xff0c;lock(),unlock() 2. 借助lock_guard 3. unique_lock: lock_guard的升级加强版 多线程的创建与执行 1. C借助标准库<thread>来实现。将函数名放入线程中即可&#xff0c;如果函数有参数…

Element--生成不定列的表格

1、对于一些场景&#xff0c;前端可能需要展示不定列数的数据&#xff1b;譬如考勤&#xff0c;可能有的人是一天一次上下班打卡&#xff0c;有的人是一天两次上下班打卡。这个时候统计就需要更具人员做不同的展示&#xff0c;不能固定在前端写死列的属性。 2、代码示例 &…

Vue + Element UI 前端篇(五):国际化实现

Vue Element UI 实现权限管理系统 前端篇&#xff08;五&#xff09;&#xff1a;国际化实现 国际化支持 1.安装依赖 执行以下命令&#xff0c;安装 i18n 依赖。 yarn add vue-i18n $ yarn add vue-i18n yarn add v1.9.4 warning package-lock.json found. Your project …

重磅:百度李彦宏、中科院曾毅入选,《时代周刊》AI最有影响力100人!

2023年9月8日&#xff0c;《时代周刊》发布了“2023年AI领域最有影响力100人” 榜单。 榜单权威吗&#xff1f; 有必要介绍下《时代周刊》。 《Time》&#xff08;时代周刊&#xff09;,1923年创刊于纽约&#xff0c;是美国公认的最重要的新闻杂志之一。《时代周刊》以报道精彩…

实例 | Python 实现 RSA 加解密

大家好&#xff0c;欢迎来到编程教室 &#xff01; 前阵子看到一篇英文文章[1]&#xff0c;展示了如何用 Python 来实现 RSA 算法。不太熟悉 RSA 的朋友可以看一下一文搞懂 RSA 算法&#xff0c;里面对什么是 RSA&#xff0c;RSA 的数学原理进行了说明&#xff0c;并举了一个简…

CTreeCtrl自绘

CSWTreeCtrl.h&#xff09; #pragma once#define _OWNER_DRAWN_TREE // 自绘CTreeCtrl&#xff0c;可支持背景图片显示功能class CSWTreeCtrl : public CTreeCtrl {DECLARE_DYNAMIC(CSWTreeCtrl)// 成员私有结构定义// 构造/析构函数 public:CSWTreeCtrl();virtual ~CSWTreeC…

pip和conda的环境管理,二者到底应该如何使用

关于pip与conda是否能混用的问题&#xff0c;Anaconda官方早就给出了回答 先说结论&#xff0c;如果conda和pip在相同环境下掺杂使用&#xff0c;尤其是频繁使用这两个工具进行包的安装&#xff0c;可能会导致环境状态混乱 就像其他包管理器一样&#xff0c;大部分这些问题均…

提升你的Android开发技能:从AR/VR沉浸到UI设计和故障排除

文章目录 探索最新AR/VR应用在教育、游戏、医疗等领域的应用教育领域游戏领域医疗领域 深入了解Android内存管理与性能优化的方法与技巧垃圾回收机制内存泄漏使用弱引用避免过度渲染内存优化图像优化延迟加载Android中的调试技术应用程序分析 分享如何提高Android应用的易用性和…

Leetcode算法入门与数组丨1. 数据结构与算法简介

文章目录 前言1 数据结构与算法1.1 数据结构1.2 算法 2 算法复杂度2.1 算法复杂度简介2.2 时间复杂度2.3 空间复杂度 3 总结 前言 Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记 这篇博客以及接下来几篇将会是一个 入门型 的文章&#xff0c;主要是自己学习的一个…

Java FTP按关键字批量下载文件

一、所需jar <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency> 二、工具类 import java.io.*; import java.net.URLConnection; import java.util.A…

032:vue中三元运算, style、class、type、 event等多种场景示例

第032个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

c++标准库的错误代码

cppreference的std::errc: std::errc - cppreference.com 对应定义(come from: 2022\Community\VC\Tools\MSVC\14.33.31629\include\xerrc.h) enum class errc { // names for generic error codesaddress_family_not_supported 102, // EAFNOSUPPORTaddress_in_use …

Hystrix Readed time out,看我这一篇就让你彻底解决!

在说这个问题的时候&#xff0c;作者真心想吐槽&#xff0c;由于作者在一个特殊的环境无法访问外网&#xff0c;所以用了度娘去查&#xff0c;发现搜索到的结果真的没啥用&#xff0c;有的根本就说不清为啥这么配置解决问题&#xff0c;有些简直的恶心一顿抄&#xff0c;有些连…

Python爬虫技术在SEO优化中的关键应用和最佳实践

大家好&#xff01;今天我要和大家分享一个关于SEO优化的秘密武器&#xff1a;Python爬虫技术。在这篇文章中&#xff0c;我们将探讨Python爬虫在SEO优化中的关键应用和最佳实践。无论您是一名SEO专家、网站管理员&#xff0c;还是对优化网站曝光度感兴趣的初学者&#xff0c;都…

《Effective Java》知识点(2)--对于所有对象都通用的方法

10. 覆盖equals时请遵守通用约定 10.1 不要轻易覆盖equals方法&#xff0c;除非迫不得已。因为&#xff1a; 10.1.1 类的每个实例本质上都是唯一的。 10.1.2 类没有必要提供”逻辑相等“的测试功能。 10.1.3 超类已经覆盖了equals&#xff0c;超类的行为对于这个类也是合适…