js树形结构递归 常用函数

  • 假设有如下树结构
const treeData = [{title: '1',id: '1',key: '1',children: [{title: '1-1',id: '2',key: '2',children: [{title: '1-1-1',id: '3',key: '3',},],},],},{title: '2',id: '2',key: '1',children: [{title: '2-1',id: '4',key: '4',children: [{title: '2-1-1',id: '5',key: '5',},],},],},];
  • 根据某一节点id 查询他的所有子孙节点并返回.
// 根据某一节点id  查询他的所有子孙节点并返回.
export function findSons(tree, nodeId) {for (let item of tree) {if (item.id === nodeId) {return item.children || [];} else if (item.children && item.children.length > 0) {let r = findSons(item.children, nodeId);if (r.length > 0) {return r;}}}return [];
}
  • 根据某一节点id 递归查找父节点 与其自身 返回 ids 数组
// 根据某一节点id 递归查找父节点 与其自身  返回 ids 数组
export function findParents(tree, id) {for (let i in tree) {if (tree[i].id == id) return [tree[i].id];if (tree[i].children) {let node = findParents(tree[i].children, id);if (node !== undefined) return node.concat(tree[i].id);}}
}
  • 根据keys 过滤节点 返回到res中
// 根据keys 过滤节点  返回到res中
export function rightTreeDataFilter(allTreeData, keys = [], res = []) {for (let item of allTreeData) {if (keys.includes(item.key)) {let one = { ...item };one.children = [];if (item.children && item.children.length > 0) {rightTreeDataFilter(item.children, keys, one.children);}res.push(one);}}
}
  • 计算树结构的长度(所有子节点 + 父节点)
// 计算树结构的长度(所有子节点 + 父节点)
export function countLength(allTreeData, count) {for (let item of allTreeData) {count.number++;count.ids.push(item.id);if (item.children && item.children.length > 0) {countLength(item.children, count);}}
}
  • 过滤树节点 不保留父节点
 // 过滤树节点 不保留父节点
export function filterTree(treeData, searchString) {// 创建一个空数组来存储结果let result = [];// 定义一个递归函数来遍历树function traverse(node) {// 检查当前节点的名称(或指定属性)是否包含搜索字符串if (node.title.includes(searchString)) {// 如果包含,则添加到结果数组中result.push(node);} else {// 遍历所有子节点if (node.children && node.children.length > 0) {node.children.forEach((child) => {traverse(child); // 递归调用});}}}// 从根节点开始遍历for (let item of treeData) {traverse(item);}// 返回结果return result;
}
  • 过滤树节点 但保留父节点
 // 过滤树节点 但保留父节点
export function filterTreeAndFather(treeData, searchString) {// 辅助函数,用于递归检查节点和它的子树function checkNodeAndSubtree(node) {// 检查当前节点的title是否包含searchStringif (node.title.includes(searchString)) {// 如果包含,则保留此节点,并递归检查其子节点// if (node.children) {//     node.children = node.children.filter(child => checkNodeAndSubtree(child));// }return true; // 返回true表示此节点或其子节点满足条件} else if (node.children) {// 尝试在子树中找到匹配的节点let hasMatchingChild = false;node.children = node.children.filter((child) => {const result = checkNodeAndSubtree(child);if (result) hasMatchingChild = true;return result;});// 如果子树中有匹配的节点,则返回true以保留此父节点return hasMatchingChild;}// 既没有匹配当前节点,也没有在子树中找到匹配的节点return false;}// 对树中的每个根节点调用辅助函数return treeData.filter((rootNode) => checkNodeAndSubtree(rootNode));
}

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

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

相关文章

Python题解Leetcode Hot100之矩阵

1. 矩阵置零 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 解题思路 题目要求进行原地更改,也就是不能使用额外的空间,因此我们可以使用第一行的元素来记录对应的…

Cesium常见设置视角所用到函数

1.左键拾取经纬度坐标 const handler new Cesium.ScreenSpaceEventHandler(viewer.canvas)// 监听鼠标点击事件handler.setInputAction(function (click) {// 使用pick函数获取点击位置的实际位置var cartesian viewer.scene.pickPosition(click.position);if (Cesium.defin…

【LeetCode】十二、递归:斐波那契 + 反转链表

文章目录 1、递归2、leetcode509:斐波那契数列3、leetcode206:反转链表4、leetcode344:反转字符串 1、递归 函数自己调用自己 递归的4个点: 递归的例子:给一个数n,在斐波那契数列中,找到n对应的…

科研与英文学术论文写作指南——于静老师课程

看到了一个特别棒的科研与英文学术论文写作指南,理论框架实例。主讲人是中科院信息工程研究所的于静老师。推荐理由:写论文和读论文或者讲论文是完全不一样的,即使现在还没有发过论文,但是通过于老师的课程,会给后续再…

LSTM水质预测模型实践

0 引言 随着水质自动站的普及,监测频次越来越高,自动监测越来越准确。 水质站点增多,连续的水质监测数据,给水质预测提供更多的训练基础。 长短时记忆网络(LSTM)适用于多变量、连续、自相关的数据预测。 人工神经网络模型特点为的…

使用requests爬取拉勾网python职位数据

爬虫目的 本文是想通过爬取拉勾网Python相关岗位数据,简单梳理Requests和xpath的使用方法。 代码部分并没有做封装,数据请求也比较简单,所以该项目只是为了熟悉requests爬虫的基本原理,无法用于稳定的爬虫项目。 爬虫工具 这次…

LVS 负载均衡群集

一:LVS群集应用基础 1.1:概述 1.群集的类型 无论是哪种群集, 都至少包括两台节点服务器, 而对外表现为一个整体, 只提供一个访问入口。根据群集所针对的目标差异, 可分为以下三种类型。 负载均衡群集&a…

使用U盘重装系统

目录 一、 制作启动盘 1. 准备一个U盘和一台电脑 2. 下载win10安装包 二、安装操作系统 1. 插入系统安装盘 2. 通过进入BIOS界面进入到我们自己制作的启动盘上 三、安装成功后进行常规设置 一、 制作启动盘 1. 准备一个U盘和一台电脑 注意:提前备份好U盘内的…

jQuery Tooltip 插件使用教程

jQuery Tooltip 插件使用教程 引言 jQuery Tooltip 插件是 jQuery UI 套件的一部分,它为网页元素添加了交互式的提示框功能。通过这个插件,开发者可以轻松地为链接、按钮、图片等元素添加自定义的提示信息,从而增强用户的交互体验。本文将详细介绍如何使用 jQuery Tooltip…

JDK1.8下载、安装与配置完整图文2024最新教程

一、报错 运行Pycharm时,报错No JVM installation found. Please install a JDK.If you already have a JDK installed, define a JAVA_HOME variable in Computer >System Properties > System Settings > Environment Variables. 首先可以检查是否已安装…

【C语言】qsort()函数详解:能给万物排序的神奇函数

🦄个人主页:修修修也 🎏所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.qsort()函数的基本信息及功能 二.常见的排序算法及冒泡排序 三.逐一解读qsort()函数的参数及其原理 1.void* base 2.size_t num 3.size_t size 4.int (*compar)(c…

2024西安国际储能产业博览会将于12月5日开幕!

2024西部国际储能产业博览会 同期举办:2024西部国际氢能源及燃料电池产业博览会 2024年12月5-7日 西安国际会展中心 规划展会规模: 50,000 ㎡ 450 60000人次 20场 展区面积 预邀展商 专业观众 行业…

节水增效,蜂窝物联智能灌溉助力农业升级!

智能灌溉的优势主要体现在以下几个方面: 1. 提高效率:智能灌溉可以根据作物生长的不同阶段和环境条件自动调整灌溉时间和水量,减少人工干预的频率和时间,提高了灌溉效率。 2. 节约水资源:智能灌溉可以根据土壤湿度和…

Python爬虫实战案例——王者荣耀皮肤抓取

大家好,我是你们的老朋友——南枫,今天我们一起来学习一下该如何抓取大家经常玩的游戏——王者荣耀里面的所有英雄的皮肤。 老规矩,直接上代码: 导入我们需要使用到的,也是唯一用到的库: 我们要抓取皮肤其…

网络物理隔离

网络物理隔离是网络安全领域中的一种基本策略,其核心目的是通过物理方式将网络或网络设备分隔开来,以确保数据安全、降低风险并提升系统的整体安全性。网络物理隔离不仅防止了未经授权的访问,也显著降低了来自外部或内部威胁的风险。以下是网…

每天一个数据分析题(四百)- 一元线性回归模型

评价一元线性回归模型拟合程度时,主要根据( )的数值 A. 相关系数 B. R2 C. SSE D. SSR 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python,SQL&…

大陆ARS548使用记录

一、Windows连接上位机 雷达是在深圳路达买的,商家给的资料中首先让配置网口,但我在使用过程中一直出现无法连接上位机的情况。接下来说说我的见解和理解。 1.1遇到的问题 按要求配置好端口后上位机无连接不到雷达,但wireshark可以正常抓到数…

PyPDF2拆分PDF文件的高级应用:指定拆分方式

本文目录 前言一、拆分方式选择1、代码讲解2、实现效果图3、完整代码前言 前两篇文章,分别讲解了将使用PyPDF2将PDF文档分割成为单个页面、在分割PDF文档时指定只分割出指定页面,如果你还没有看过,然后有需要的话,可以去看一下,我把文章链接贴到这里: PyPDF2拆分PDF文件…

Nuxt3 的生命周期和钩子函数(九)

title: Nuxt3 的生命周期和钩子函数(九) date: 2024/7/3 updated: 2024/7/3 author: cmdragon excerpt: 摘要:本文介绍了Nuxt3中与Vite相关的五个生命周期钩子,包括vite:extend、vite:extendConfig、vite:configResolved、vite…

CVE-2024-6387漏洞预警:尽快升级OpenSSH

OpenSSH维护者发布了安全更新,其中包含一个严重的安全漏洞,该漏洞可能导致在基于glibc的Linux系统中使用root权限执行未经身份验证的远程代码。该漏洞的代号为regreSSHion,CVE标识符为CVE-2024-6387。它驻留在OpenSSH服务器组件(也…