当前位置: 首页 > news >正文

有关树形结构数据的功能函数

本文主要介绍的是 有关树形结构数据的处理,下面主要写了几个针对相关功能的功能函数,在此记录一下:

一,在树形数据中,找到某个节点中id为指定值的数据节点(树形结构中所有节点,包括子节点):

function findNodeById(treeData, nodeId) {// 遍历当前层级的所有节点for (var i = 0; i < treeData.length; i++) {var node = treeData[i];// 如果当前节点的 ID 匹配目标节点的 ID,则返回当前节点if (node.id === nodeId) {return node;}// 如果当前节点有子节点,则递归调用当前函数继续查找子节点if (node.children && node.children.length > 0) {var foundNode = findNodeById(node.children, nodeId);// 如果在子节点中找到了目标节点,则返回找到的节点if (foundNode) {return foundNode;}}}// 如果遍历完所有节点仍未找到目标节点,则返回 nullreturn null;
}

二,根据根节点的id将一个一维数组转变为树形数据(rootValue即根节点的id):

function transListToTreeData(list, rootValue) {// 思路:先找到所有的根节点,然后再再去添加children,第二个参数是根节点的pid值var arr = [];list.forEach((item) => {if (item.pid === rootValue) {const children = transListToTreeData(list, item.id);if (children.length) {// 如果children的长度大于0就说明找到了子节点item.children = children;}arr.push(item);}});return arr;
}

三,获取树形根节点的status 值为currentStatus的根节点的节点个数:

    function getRootNodeByStatusCount(treeData,currentStatus){let count = 0;if (treeData && treeData.length) { // 判断数据是否存在并且不为空for (let i = 0; i < treeData.length; i++) { // 遍历子节点const node = treeData[i];if (node.status == currentStatus) { // 如果当前节点的 status 为 0,count 加一count++;}if (node.children && node.children.length > 0) { // 如果当前节点存在子节点,则递归遍历子节点count += getRootNodeByStatusCount(node.children,currentStatus);}}}return count;},

四,获取根节点的个数(树形结构中所有节点个数):

    function getRootNodeCount(treeData) {if (!Array.isArray(treeData)) {return 0;}let count = 0;for (const node of treeData) {// 如果当前节点没有子节点,则累加计数器if (!node.children) {count++;}if (Array.isArray(node.children)) {// 如果节点有子节点,对其进行递归处理count += this.getRootNodeCount(node.children);}}return count;},

五,根据传入的id数组,给该节点添加一个disabled属性值为false,其他节点添加一个disabled属性值为true(相当于给特定的节点添加树形,其它不需要的节点也添加,可扩展):

      function disableTreeNodes(treeData, idArray) {if (!Array.isArray(treeData)) {return;}for (const node of treeData) {if (idArray.includes(node.id)) {// 如果当前节点在 idArray 数组中,则继续递归它的子节点// if (Array.isArray(node.children)) {node.disabled = false;disableTreeNodes(node.children, idArray);// }} else {// 否则将当前节点设为禁用状态,并递归它的子节点node.disabled = true;if (Array.isArray(node.children)) {disableTreeNodes(node.children, idArray);}}}},

六,返回根节点status属性值为status的节点树(根据不通属性的值 返回该节点的所有树形数据):

    function filterRootNodes(data,status) {if (!data || data.length === 0) { // 判断数据是否存在并且不为空,如果是,则直接返回空数组return [];}const filteredData = []; // 定义过滤后的数据数组for (let i = 0; i < data.length; i++) { // 遍历每个节点const node = data[i];if (node.status == status) {filteredData.push(node);}if (node.children && node.children.length > 0) { // 如果当前节点存在子节点,则递归遍历子节点const filteredChildren = filterRootNodes(node.children,status); // 对子节点进行递归过滤if (filteredChildren.length > 0) { // 如果过滤后的子节点不为空,则将该节点加入到过滤后的数据数组中,并将过滤后的子节点作为其 children 属性的值filteredData.push({name: node.name,id:node.id,children: filteredChildren,});}}}return filteredData;},
[{label: '一级 1',children: [{label: '二级 1-1',children: [{label: '三级 1-1-1',status:1,}]}]}, {label: '一级 2',children: [{label: '二级 2-1',children: [{label: '三级 2-1-1',status:1,}]}, {label: '二级 2-2',children: [{label: '三级 2-2-1',status:0,}]}]}, {label: '一级 3',children: [{label: '二级 3-1',children: [{label: '三级 3-1-1',status:1,}]}, {label: '二级 3-2',children: [{label: '三级 3-2-1',status:0,}]}]}]

最后 数据奉上不用手敲,对你有用的话点赞收藏吧!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Uniapp 调用aar、jar包
  • 什么是Jmeter ?Jmeter使用的原理步骤是什么?
  • Cobalt Strike 4.8 用户指南-第五节-获取初始访问
  • [数据集][目标检测]玻璃瓶塑料瓶检测数据集VOC+YOLO格式8943张2类别
  • 猫咪浮毛清理措施?希喂、安德迈、有哈宠物空气净化器数据大揭秘
  • html+css+js网页设计 翘珠宝微商城移动端20个页面
  • 正则表达式实现带有条件的爬取
  • .net dataexcel winform控件 更新 日志
  • Linux - 深入探讨 Linux `ls` 命令:一个全面的技术指南
  • 【前端面试】采用react前后,浏览器-解析渲染UI的变化
  • cnocr 安装
  • OpenHarmony使用ArkUI Inspector分析布局
  • 一套高效、稳定的自卸车自动充电系统
  • 3.7 Browser -- useMediaQuery
  • 数字经济GBC管理平台高管培训在京圆满成功举办
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • C++11: atomic 头文件
  • canvas 绘制双线技巧
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ES6语法详解(一)
  • Github访问慢解决办法
  • Linux gpio口使用方法
  • maya建模与骨骼动画快速实现人工鱼
  • Spring Cloud Feign的两种使用姿势
  • SpringBoot 实战 (三) | 配置文件详解
  • Swift 中的尾递归和蹦床
  • VuePress 静态网站生成
  • 包装类对象
  • 入门级的git使用指北
  • 小程序 setData 学问多
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 最近的计划
  • postgresql行列转换函数
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • $.ajax()方法详解
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (11)MSP430F5529 定时器B
  • (3) cmake编译多个cpp文件
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (day18) leetcode 204.计数质数
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)计算机毕业设计ssm电影分享网站
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (力扣)循环队列的实现与详解(C语言)
  • (论文阅读30/100)Convolutional Pose Machines
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (学习总结16)C++模版2
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)3D模板阴影原理
  • .NET gRPC 和RESTful简单对比
  • .NET Standard 的管理策略
  • .Net Web窗口页属性