使用js将后台返回的数据转换成树形结构
将类似如下数据转换成树形的数据:
- [
- { id: 1, name: '1', },
- { id: 2, name: '1-1', parentId: 1 },
- { id: 3, name: '1-1-1', parentId: 2 },
- { id: 4, name: '1-2', parentId: 1 },
- { id: 5, name: '1-2-2', parentId: 4 },
- { id: 6, name: '1-1-1-1', parentId: 3 },
- { id: 7, name: '2', }
- ]
转换方法为:
- function translateDataToTree(data) {
- let parents = data.filter(value => value.parentId == 'undefined' || value.parentId == null)
- let children = data.filter(value => value.parentId !== 'undefined' && value.parentId != null)
- let translator = (parents, children) => {
- parents.forEach((parent) => {
- children.forEach((current, index) => {
- if (current.parentId === parent.id) {
- let temp = JSON.parse(JSON.stringify(children))
- temp.splice(index, 1)
- translator([current], temp)
- typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current]
- }
- }
- )
- }
- )
- }
- translator(parents, children)
- return parents
- }
转换后数据是:
- [
- {
- "id": 1,
- "name": "1",
- "children": [
- {
- "id": 2,
- "name": "1-1",
- "parentId": 1,
- "children": [
- {
- "id": 3,
- "name": "1-1-1",
- "parentId": 2,
- "children": [
- {
- "id": 6,
- "name": "1-1-1-1",
- "parentId": 3
- }
- ]
- }
- ]
- },
- {
- "id": 4,
- "name": "1-2",
- "parentId": 1,
- "children": [
- {
- "id": 5,
- "name": "1-2-2",
- "parentId": 4
- }
- ]
- }
- ]
- },
- {
- "id": 7,
- "name": "2"
- }
- ]
思路:将有父子关系的数组数据先分为两类,一类是没有父节点的数据(取个别名parents),另一类是有父节点的数据(取个别名children),然后通过遍历parents,对每一个父节点在children查找对应的子节点,并将其放入父节点的children中(这里我的是以children表示子节点),然后每个子节点又作为一个父节点来重复之前的动作。(可能这里描述的不太清楚,下面我将对方法进行注释说明)
- /**
- * 该方法用于将有父子关系的数组转换成树形结构的数组
- * 接收一个具有父子关系的数组作为参数
- * 返回一个树形结构的数组
- */
- function translateDataToTree(data) {
- //没有父节点的数据
- let parents = data.filter(value => value.parentId == 'undefined' || value.parentId == null)
- //有父节点的数据
- let children = data.filter(value => value.parentId !== 'undefined' && value.parentId != null)
- //定义转换方法的具体实现
- let translator = (parents, children) => {
- //遍历父节点数据
- parents.forEach((parent) => {
- //遍历子节点数据
- children.forEach((current, index) => {
- //此时找到父节点对应的一个子节点
- if (current.parentId === parent.id) {
- //对子节点数据进行深复制,这里只支持部分类型的数据深复制,对深复制不了解的童靴可以先去了解下深复制
- let temp = JSON.parse(JSON.stringify(children))
- //让当前子节点从temp中移除,temp作为新的子节点数据,这里是为了让递归时,子节点的遍历次数更少,如果父子关系的层级越多,越有利
- temp.splice(index, 1)
- //让当前子节点作为唯一的父节点,去递归查找其对应的子节点
- translator([current], temp)
- //把找到子节点放入父节点的children属性中
- typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current]
- }
- }
- )
- }
- )
- }
- //调用转换方法
- translator(parents, children)
- //返回最终的结果
- return parents
- }
使用js将后台返回的数据转换成树形结构的更多相关文章
- SpringMVC系列(十一)把后台返回的数据转换成json、文件下载、文件上传
一.后台返回的数据转换成json 1.引入转换json需要的3个依赖 <!--json转换需要的依赖 begin --> <dependency> <groupId> ...
- javascript将平行的拥有上下级关系的数据转换成树形结构
转换函数 var Littlehow = {}; /** * littlehow 2019-05-15 * 平行数据树形转换器 * @type {{format: tree.format, sort: ...
- c# List列表数据转换成树形结构
把List列表结构 转换成树形结构 /// <summary> /// 构造树形Json /// </summary> public static class TreeJson ...
- js将有父子关系的数据转换成树形结构数据
js将有父子关系的数据转换成树形结构数据 比如如下基本数据: let allDatas = [ { id: 3, name: 'bbbb', parendId: 1 }, { id: 2, name: ...
- JS将扁平化的数据处理成Tree结构
let jsonData= [ { id:1, parentId:0, name:"一级菜单A" }, { id:2, parentId:0, name:"一级菜单B& ...
- 记一则 Lambda内递归调用方法将集合对象转换成树形结构
public dynamic GetDepartments(string labID) { List<int> usedIDs = new List<int>(); //缓存已 ...
- 使用js处理后台返回的Date类型的数据
从后台返回的日期类型的数据,如果直接在前端进行显示的话,显示的就是一个从 1970-01-01 00:00:00到现在所经过的毫秒数,而在大多数业务中都不可能显示这个毫秒数,大多数都是显示一个正常的日 ...
- JS获取后台返回的JSON数据
问题:通过$.get从后台获取了一段json串{"id":"1","name":"ww"},然后要拿到这里面的id和na ...
- js下载后台返回的docx(返回格式:文档流)文件
原文地址: https://www.jianshu.com/p/a81c68c15fbd PS需要指定responseType类型,不然文件内容会乱码哦 咦?文件名乱码?需要手动设置文件名哦↓ 呀,文 ...
随机推荐
- 《剑指offer》面试题1:为类CMyString添加赋值运算符函数——C++拷贝构造函数与赋值函数
题中已给出CMyString的类定义,要求写赋值运算符函数. #include<iostream> #include<cstring> using namespace std; ...
- E20180527-hm
percolate vi. 渗透; 滤; 渗入; (思想等) 渗透
- [Xcode 实际操作]九、实用进阶-(3)给代码方法添加宏注释
目录:[Swift]Xcode实际操作 本文将演示如何在方法列表中,对方法名称进行注释. 这样可以使程序,按功能分块,使方法清晰.易读并且方便定位. 在项目导航区,打开视图控制器的代码文件[ViewC ...
- Python 去除列表中重复的元素(转载http://blog.csdn.net/zhengnz/article/details/6265282)
比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a']l2 = list(set(l1))print l2 还有一种据说速度更快的,没测试过两者的速度 ...
- bzoj 2441 [中山市选2011]小W的问题
bzoj 2441 [中山市选2011]小W的问题 Description 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个"W"出来.具 ...
- 牛客练习赛42A(字符串)
传送门 结论是:一定是选取最长的那个AB连续子串. 把题面要求的a*b + a + b转化一下成(a + 1)*(b + 1) - 1,即可发现如果选取前缀后缀不连续的两段作为答案,则显然有更优解,即 ...
- struts2的@Result annotation 如何添加params,并且在页面取值
http://www.bubuko.com/infodetail-2492575.html .............................................. 标签:lai ...
- 关于foreach的一个BUG
foreach用起来比for更方便,但是foreach隐藏的操作,可能带来更多未知的BUG,今天就遇到一个问题.编程环境VS2010 //使用foreach遍历,其中未改变item的值,但是使用了匿名 ...
- Jenkins之发布报错“error: RPC failed; curl 18 transfer closed with outstanding read data remaining”
报错信息: error: RPC failed; curl transfer closed with outstanding read data remaining fatal: The remote ...
- 模拟IO 读写压力测试
#### 本实验室通过创建一个测试表myTestTable ,分配在一个足够大小的表空间. ###然后通过 insert select 方式,创建100个后台进程进行读写操作,每个后台进程预计时间20 ...