分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

路径字符串数据转化为树型层级对象,path to json tree

发布时间:2023-09-06 01:39责任编辑:郭大石关键词:jsjson

由于项目中使用了react 及 ant-design ,在使用tree树型控件时,需要
类似下面的数据,

const treeData = [{ ?title: ‘0-0‘, ?key: ‘0-0‘, ?children: [{ ???title: ‘0-0-0‘, ???key: ‘0-0-0‘, ???children: [ ?????{ title: ‘0-0-0-0‘, key: ‘0-0-0-0‘ }, ?????{ title: ‘0-0-0-1‘, key: ‘0-0-0-1‘ }, ?????{ title: ‘0-0-0-2‘, key: ‘0-0-0-2‘ }, ???], ?}];

但是后台传输过来的往往是下面这样的路径字符串数组,这就需要我们进行转化为树形层级对象了。

 var arr=[ ???"root/", ???"root/a/", ???"root/a/new_b.png", ???"root/a/qa/", ???"root/a/qa/新建文本文档 (3).txt", ???"root/asdfasdfasdfasdfasdfasdfasdf.txt", ???"root/b.png", ???"root/instqj_gfzqhk.exe", ???"root/jupyter_notebook.png", ???"root/new_b.png", ???"root/output/new_b.png", ???"root/soffice.exe", ???"root/ti/asdfasdfasdfasdfasdfasdfasdf.txt", ???"root/watermark.zip", ???"root/中华人民共和国国民经济和社会发展 第十三个五年规划纲要 .pdf", ???"root/国务院发布《中国制造2025》%28全文%29.pdf", ???"root/新建文本文档 (3).txt", ???"root/新建文本文档.txt", ???"root/沧海一声笑.docx", ???"root/理光C2011SP.exe"]

接下来我们开始行动

const pathToTree = (input) => { ???var output = []; ???for (var i = 0; i < input.length; i++) { ???????var chain = input[i].split("/"); ???????var currentNode = output; ???????for (var j = 0; j < chain.length; j++) { ???????????if (chain[j] === ‘‘) { ???????????????break; ???????????} ???????????var wantedNode = chain[j]; ???????????var lastNode = currentNode; ???????????for (var k = 0; k < currentNode.length; k++) { ???????????????if (currentNode[k].title == wantedNode) { ???????????????????currentNode = currentNode[k].children; ???????????????????break; ???????????????} ???????????} ???????????if (lastNode == currentNode) { ???????????????var newNode = currentNode[k] = { key: input[i], title: wantedNode, children: [] }; ???????????????currentNode = newNode.children; ???????????} else { ???????????????delete currentNode.children ???????????} ???????} ???} ???return output;}console.log(pathToTree(arr))

得到了我们想要的结果

光是这样还不够,我们使用ant-design中的tree树形控件,不能让最低层级有children属性,同时,我们自己也可以额外定一个需求:所有文件名字长度不能超过一定数量。
另外,由于我的项目是上传到亚马逊S3,有的文件夹不会返回给我,比如这个文件"root/ti/asdfasdfasdfasdfasdfasdfasdf.txt"就没有返回" root/ti/",所以我们要加上个层级数据。
我们这里遍历这个树型对象,简单处理一下

const traverseTree = function (data) { ???return data.map((item) => { ???????//如果有相同的key,react的渲染会有问题,所以要处理一下。 ???????let chain = item.key.split(‘/‘); ???????if (item.title !== chain.slice(-1)[0]) { ???????????item.key = chain.slice(0, -1).join(‘/‘) ???????} ???????item.title = item.title.length > 10 ? item.title.substring(0, 7) + "..." : item.title ???????if (item.children.length > 0) { ???????????traverseTree(item.children) ???????????return item ???????} else { ???????????delete item.children ???????????return item ???????} ???})}console.log(traverseTree(pathToTree(arr)))

输出结果

路径字符串数据转化为树型层级对象,path to json tree

原文地址:https://www.cnblogs.com/liaozhenting/p/8343827.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved