如何将路径字符串数组(string[])转成树结构(treeNode[])?

news2024/11/26 11:51:08

原文链接:如何将路径字符串数组(string[])转成树结构(treeNode[])?

需求

这里的UI使用的是Element-Plus

将一个路径字符串数组(当然也可能是其他目标字符串数组),渲染成

/*

source:
  /a/b/c/d/e
  /a/b/e/f/g
  /a/b/h
  /a/i/j
  /a/i/k

what I need:
       a
     /   \
    b     i
   /|\   / \
  c e h j   k
  | |
  d f
  | |
  e g   

*/

这里模拟了待转化的字符串数组如下:

let TargetKeyLists = [
    "D:\\$RECYCLE.BIN\\S-1-5-21-2980625316-768050560-104202119-1001\\$I0KVI2C.css",
    "D:\\$RECYCLE.BIN\\S-1-5-21-2980625316-768050560-104202119-1001\\$I61JY0M.php",
    "D:\\$RECYCLE.BIN\\S-1-5-21-2980625316-768050560-104202119-1001\\$I8IC15E.html",
    "D:\\$RECYCLE.BIN\\S-1-5-21-2980625316-768050560-104202119-1001\\$I9UTNI9.ico",
    "D:\\Program Files\\Sandboxie",
    "D:\\fbs\\xampp-windows-x64-8.2.0-0-VS16-installer.exe",
    "D:\\fcstor\\.svn",
    "D:\\xampp\\MercuryMail",
    "D:\\xampp\\anonymous",
    "D:\\xampp\\apache",
    "C:\\$Recycle.Bin\\S-1-5-18",
    "C:\\$Recycle.Bin\\S-1-5-21-2980625316-768050560-104202119-1001",
    "C:\\$Recycle.Bin\\S-1-5-21-2980625316-768050560-104202119-500",
    "C:\\BOOTNXT",
]

转化后的目标结构如下:

[
    {
        "label": "D:",
        "children": [
            {
                "label": "$RECYCLE.BIN",
                "children": [
                    {
                        "label": "S-1-5-21-2980625316-768050560-104202119-1001",
                        "children": [
                            {
                                "label": "$I0KVI2C.css",
                                "children": []
                            },
                            {
                                "label": "$I61JY0M.php",
                                "children": []
                            },
                            {
                                "label": "$I8IC15E.html",
                                "children": []
                            },
                            {
                                "label": "$I9UTNI9.ico",
                                "children": []
                            }
                        ]
                    }
                ]
            },
            {
                "label": "Program Files",
                "children": [
                    {
                        "label": "Sandboxie",
                        "children": []
                    }
                ]
            },
            {
                "label": "fbs",
                "children": [
                    {
                        "label": "xampp-windows-x64-8.2.0-0-VS16-installer.exe",
                        "children": []
                    }
                ]
            },
            {
                "label": "fcstor",
                "children": [
                    {
                        "label": ".svn",
                        "children": []
                    }
                ]
            },
            {
                "label": "xampp",
                "children": [
                    {
                        "label": "MercuryMail",
                        "children": []
                    },
                    {
                        "label": "anonymous",
                        "children": []
                    },
                    {
                        "label": "apache",
                        "children": []
                    }
                ]
            }
        ]
    },
    {
        "label": "C:",
        "children": [
            {
                "label": "$Recycle.Bin",
                "children": [
                    {
                        "label": "S-1-5-18",
                        "children": []
                    },
                    {
                        "label": "S-1-5-21-2980625316-768050560-104202119-1001",
                        "children": []
                    },
                    {
                        "label": "S-1-5-21-2980625316-768050560-104202119-500",
                        "children": []
                    }
                ]
            },
            {
                "label": "BOOTNXT",
                "children": []
            }
        ]
    }
]

步骤

1.在utils文件夹下新建index.ts文件。

interface TreeNode {
    label: string
    children: TreeNode[]
}

// 循环构建子节点
const buildChildrenNode = (children: TreeNode[], nodeArray: string[]) => {
    for (let i in nodeArray) {
        let _i: number = Number(i)
        let node: TreeNode = {
            label: nodeArray[_i],
            children: []
        }
        if (_i != nodeArray.length) {
            node.children = []
        }
        if (children.length == 0) {
            children.push(node)
        }
        let isExist = false
        for (let j in children) {
            if (children[j].label == node.label) {
                if (_i != nodeArray.length - 1 && !children[j].children) {
                    children[j].children = []
                }
                children = _i == nodeArray.length - 1 ? children : children[j].children
                isExist = true
                break
            }
        }
        if (!isExist) {
            children.push(node)
            if (_i != nodeArray.length - 1 && !children[children.length - 1].children) {
                children[children.length - 1].children = []
            }
            children = _i == nodeArray.length - 1 ? children : children[children.length - 1].children
        }
    }
}
/**
 * @description: string[] ->  treeNode[]
 * @param {string} list 资源路径数组
 * @param {string} clientLabel 是否需要在最外面还要套一层(exam:所属客户端)
 * @return { treeNode[] }
 */
export const array2Tree = (list: string[], clientLabel?: string) => {
    let targetList: TreeNode[] = []
    list.map(item => {
        let label = item
        let nodeArray: string[] = label.split('\\').filter(str => str != '')
        // 递归
        let children: TreeNode[] = targetList
        // 构建根节点
        if (children.length == 0) {
            let root: TreeNode = {
                label: nodeArray[0],
                children: []
            }
            if (nodeArray.length > 1) {
                root.children = []
            }
            children.push(root)
            buildChildrenNode(children, nodeArray)
        } else {
            buildChildrenNode(children, nodeArray)
        }
    })
    if (!clientLabel) {
        return targetList
    } else {
        const newArr = [{
            label: clientLabel,
            children: targetList
        }]
        return newArr
    }
}

2.在目标页面中引入并调用array2Tree方法即可。

<template>
    <el-tree :data="confirmTreeList" default-expand-all />
</template>
import { array2Tree } from '@/utils/index'

let confirmTreeList: TreeNode[] = []

confirmTreeList = array2Tree(TargetKeyLists)

3.效果如下:

这里说明一下,array2Tree()方法中的clientLabel参数其实可要可不要,也可继续扩展,根据自身业务而定。

比如我想最后实现的效果如下图所示:

所以在第2步中传入clientLabel即可:

confirmTreeList = array2Tree(TargetKeyLists,'test(192.168.0.213)')

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

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

相关文章

深入浅出对话系统——闲聊对话系统

引言 闲聊对话系统也很多别名 聊天机器人ChatbotSocial ChatbotChit-chat botConversational AI开放领域对话系统 实现方法 现在闲聊对话系统一般有两种主要的实现方法 检索式对话系统生成式对话系统 可以任务闲聊对话系统也是一个函数 y f ( x ) yf(x) yf(x)&#xff0…

6-Linux的磁盘分区和挂载

Linux的磁盘分区和挂载 Linux分区查看所有设备的挂载情况 将磁盘进行挂载的案例增加一块磁盘的总体步骤1-在虚拟机中增加磁盘2- 分区3-格式化分区4-挂载分区5-进行永久挂载 磁盘情况查询查询系统整体磁盘使用情况查询指定目录的磁盘占用情况 磁盘情况-工作实用指令统计文件夹下…

【Docker】Docker网络之五大网络模式

Docker网络 1.Docker网络2.Docker的网络模式3.网络模式详解3.1 host模式3.2 container模式3.3 none模式3.4 bridge模式3.5 自定义网络模式 4.docker网络模式知识点总结 1.Docker网络 Docker网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(dock…

Cesium态势标绘专题-圆角矩形(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

RNN架构解析——传统RNN模型

目录 传统RNN的内部结构图使用RNN优点和缺点 传统RNN的内部结构图 使用RNN rnnnn.RNN(5,6,1) #第一个参数是输入张量x的维度&#xff0c;第二个是隐藏层维度&#xff0c;第三层是隐藏层的层数 input1torch.randn(1,3,5) #第一个是输入序列的长度&#xff0c;第二个是批次的样本…

FPGA设计时序分析二、建立/恢复时间

目录 一、背景知识 1.1 理想时序模型 1.2 实际时序模型 1.2.1 时钟不确定性 1.2.2 触发器特性 二、时序分析 2.1 时序模型图 ​2.2 时序定性分析 一、背景知识 之前的章节提到&#xff0c;时钟对于FPGA的重要性不亚于心脏对于人的重要性&#xff0c;所有的逻辑运算都离开…

[start] m40 test

software & update 470 drive version # cd /etc/apt # mv sources.list sources.list.bak # sudo vi /etc/apt/sources.list # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ja…

供应商管理平台:高效整合资源,提升供应链效能

随着全球市场竞争的不断升级&#xff0c;企业对供应商管理的重要性越来越重视。而供应商管理平台作为一种高效整合资源、提升供应链效能的工具&#xff0c;对于企业来说意义深远。本文将围绕供应商管理平台的概念、优势以及应用&#xff0c;探讨其在提升供应商管理和优化供应链…

面向对象编程:多态性的理论与实践

文章目录 1. 修饰词和访问权限2. 多态的概念3. 多态的使用现象4. 多态的问题与解决5. 多态的意义 在面向对象编程中&#xff0c;多态是一个重要的概念&#xff0c;它允许不同的对象以不同的方式响应相同的消息。本文将深入探讨多态的概念及其应用&#xff0c;以及在Java中如何实…

Docker 网络端口映射 四大网络模式

Docker 网络端口映射 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网…

爆肝整理,接口测试方法总结+常问面试题(答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 理想的测试流程 …

flask路由添加参数

flask路由添加参数 在 Flask 中&#xff0c;可以通过两种方式在路由中添加参数&#xff1a;在路由字符串中直接指定参数&#xff0c;或者通过 request 对象从请求中获取参数。 在路由字符串中指定参数&#xff1a;可以将参数直接包含在路由字符串中。参数可以是字符串、整数、…

8-js高级-6(promise)

一 Promise 的理解和使用 1 Promise 是什么? 理解 抽象表达: Promise 是一门新的技术(ES6 规范)Promise 是 JS 中进行异步编程的新解决方案 (备注&#xff1a;旧方案是单纯使用回调函数) 具体表达: 从语法上来说: Promise 是一个构造函数从功能上来说: promise 对象用来…

vue3 实现排序按钮

需求背景解决效果index.vue 需求背景 需要实现一个复用性&#xff0c;是提供表单顺倒排序的按钮 解决效果 index.vue <!--/*** author: liuk* date: 2023/7/25* describe: 排序按钮*/--> <template><div class"sort-fn"><span :class"[…

记一次完整体系的攻防演练

准备工作&#xff1a; 1&#xff0c;在客户的内网环境部署一个Windows7系统&#xff0c;在这个系统上把finecms这个应用部署上去。把finecms安装之后&#xff0c;和客户沟通&#xff0c;把这个应用的地址映射到公网上去。 2&#xff0c;其次&#xff0c;没有条件的话&#xff0…

蓝桥杯上岸必背!!!(第七期 最短路算法)

第七期&#xff1a;最短路算法&#x1f525; &#x1f525; &#x1f525; 蓝桥杯热门考点模板总结来啦✨ 你绝绝绝绝绝绝对不能错过的常考最短路算法模板 &#x1f4a5; ❗️ ❗️ ❗️ 大家好 我是寸铁✨ 还没背熟模板的伙伴们背起来 &#x1f4aa; &#x1f4aa; &…

SpringBoot整合JavaMail

SpringBoot整合JavaMail 简单使用-发送简单邮件 介绍协议 导入坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>添加配置 spring:mail:host: smtp.qq.co…

JVM系统优化实践(23):GC生产环境案例(6)

您好&#xff0c;这里是「码农镖局」CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 在互联网大厂中&#xff0c;对每天亿级流量的日志进行清洗、整理是非常常见的工作。在某个系统中&#xff0c;需要对用户的访问日志做脱敏处理&#xff0c;也就是清洗掉姓名…

day41-Verify Account Ui(短信验证码小格子输入效果)

50 天学习 50 个项目 - HTMLCSS and JavaScript day41-Verify Account Ui&#xff08;短信验证码小格子输入效果&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&qu…

Shell脚本实战——对MySQL进行分库分表备份

一、查看当前数据库以及数据表 如何除去Datebase标题字样以及系统自带的数据库呢&#xff1f;可以使用以下命令 mysql -uroot -p#BenJM123 -e show databases -N | egrep -v "information_schema|mysql|performance_schema|sys"剩下的两个就是用户自己创建的表啦&am…