将类似如下数据转换成树形的数据:

  1. [
  2.  
  3. { id: 1, name: '1', },
  4.  
  5. { id: 2, name: '1-1', parentId: 1 },
  6.  
  7. { id: 3, name: '1-1-1', parentId: 2 },
  8.  
  9. { id: 4, name: '1-2', parentId: 1 },
  10.  
  11. { id: 5, name: '1-2-2', parentId: 4 },
  12.  
  13. { id: 6, name: '1-1-1-1', parentId: 3 },
  14.  
  15. { id: 7, name: '2', }
  16.  
  17. ]

转换方法为:

  1. function translateDataToTree(data) {
  2. let parents = data.filter(value => value.parentId == 'undefined' || value.parentId == null)
  3. let children = data.filter(value => value.parentId !== 'undefined' && value.parentId != null)
  4. let translator = (parents, children) => {
  5. parents.forEach((parent) => {
  6. children.forEach((current, index) => {
  7. if (current.parentId === parent.id) {
  8. let temp = JSON.parse(JSON.stringify(children))
  9. temp.splice(index, 1)
  10. translator([current], temp)
  11. typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current]
  12. }
  13. }
  14. )
  15. }
  16. )
  17. }
  18.  
  19. translator(parents, children)
  20.  
  21. return parents
  22. }

转换后数据是:

  1. [
  2. {
  3. "id": 1,
  4. "name": "1",
  5. "children": [
  6. {
  7. "id": 2,
  8. "name": "1-1",
  9. "parentId": 1,
  10. "children": [
  11. {
  12. "id": 3,
  13. "name": "1-1-1",
  14. "parentId": 2,
  15. "children": [
  16. {
  17. "id": 6,
  18. "name": "1-1-1-1",
  19. "parentId": 3
  20. }
  21. ]
  22. }
  23. ]
  24. },
  25. {
  26. "id": 4,
  27. "name": "1-2",
  28. "parentId": 1,
  29. "children": [
  30. {
  31. "id": 5,
  32. "name": "1-2-2",
  33. "parentId": 4
  34. }
  35. ]
  36. }
  37. ]
  38. },
  39. {
  40. "id": 7,
  41. "name": "2"
  42. }
  43. ]

思路:将有父子关系的数组数据先分为两类,一类是没有父节点的数据(取个别名parents),另一类是有父节点的数据(取个别名children),然后通过遍历parents,对每一个父节点在children查找对应的子节点,并将其放入父节点的children中(这里我的是以children表示子节点),然后每个子节点又作为一个父节点来重复之前的动作。(可能这里描述的不太清楚,下面我将对方法进行注释说明)

  1. /**
  2. * 该方法用于将有父子关系的数组转换成树形结构的数组
  3. * 接收一个具有父子关系的数组作为参数
  4. * 返回一个树形结构的数组
  5. */
  6. function translateDataToTree(data) {
  7. //没有父节点的数据
  8. let parents = data.filter(value => value.parentId == 'undefined' || value.parentId == null)
  9.  
  10. //有父节点的数据
  11. let children = data.filter(value => value.parentId !== 'undefined' && value.parentId != null)
  12.  
  13. //定义转换方法的具体实现
  14. let translator = (parents, children) => {
  15. //遍历父节点数据
  16. parents.forEach((parent) => {
  17. //遍历子节点数据
  18. children.forEach((current, index) => {
  19. //此时找到父节点对应的一个子节点
  20. if (current.parentId === parent.id) {
  21. //对子节点数据进行深复制,这里只支持部分类型的数据深复制,对深复制不了解的童靴可以先去了解下深复制
  22. let temp = JSON.parse(JSON.stringify(children))
  23. //让当前子节点从temp中移除,temp作为新的子节点数据,这里是为了让递归时,子节点的遍历次数更少,如果父子关系的层级越多,越有利
  24. temp.splice(index, 1)
  25. //让当前子节点作为唯一的父节点,去递归查找其对应的子节点
  26. translator([current], temp)
  27. //把找到子节点放入父节点的children属性中
  28. typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current]
  29. }
  30. }
  31. )
  32. }
  33. )
  34. }
  35.  
  36. //调用转换方法
  37. translator(parents, children)
  38.  
  39. //返回最终的结果
  40. return parents
  41. }

使用js将后台返回的数据转换成树形结构的更多相关文章

  1. SpringMVC系列(十一)把后台返回的数据转换成json、文件下载、文件上传

    一.后台返回的数据转换成json 1.引入转换json需要的3个依赖 <!--json转换需要的依赖 begin --> <dependency> <groupId> ...

  2. javascript将平行的拥有上下级关系的数据转换成树形结构

    转换函数 var Littlehow = {}; /** * littlehow 2019-05-15 * 平行数据树形转换器 * @type {{format: tree.format, sort: ...

  3. c# List列表数据转换成树形结构

    把List列表结构 转换成树形结构 /// <summary> /// 构造树形Json /// </summary> public static class TreeJson ...

  4. js将有父子关系的数据转换成树形结构数据

    js将有父子关系的数据转换成树形结构数据 比如如下基本数据: let allDatas = [ { id: 3, name: 'bbbb', parendId: 1 }, { id: 2, name: ...

  5. JS将扁平化的数据处理成Tree结构

    let jsonData= [ { id:1,  parentId:0, name:"一级菜单A" }, { id:2, parentId:0, name:"一级菜单B& ...

  6. 记一则 Lambda内递归调用方法将集合对象转换成树形结构

    public dynamic GetDepartments(string labID) { List<int> usedIDs = new List<int>(); //缓存已 ...

  7. 使用js处理后台返回的Date类型的数据

    从后台返回的日期类型的数据,如果直接在前端进行显示的话,显示的就是一个从 1970-01-01 00:00:00到现在所经过的毫秒数,而在大多数业务中都不可能显示这个毫秒数,大多数都是显示一个正常的日 ...

  8. JS获取后台返回的JSON数据

    问题:通过$.get从后台获取了一段json串{"id":"1","name":"ww"},然后要拿到这里面的id和na ...

  9. js下载后台返回的docx(返回格式:文档流)文件

    原文地址: https://www.jianshu.com/p/a81c68c15fbd PS需要指定responseType类型,不然文件内容会乱码哦 咦?文件名乱码?需要手动设置文件名哦↓ 呀,文 ...

随机推荐

  1. 《剑指offer》面试题1:为类CMyString添加赋值运算符函数——C++拷贝构造函数与赋值函数

    题中已给出CMyString的类定义,要求写赋值运算符函数. #include<iostream> #include<cstring> using namespace std; ...

  2. E20180527-hm

    percolate vi. 渗透; 滤; 渗入; (思想等) 渗透

  3. [Xcode 实际操作]九、实用进阶-(3)给代码方法添加宏注释

    目录:[Swift]Xcode实际操作 本文将演示如何在方法列表中,对方法名称进行注释. 这样可以使程序,按功能分块,使方法清晰.易读并且方便定位. 在项目导航区,打开视图控制器的代码文件[ViewC ...

  4. Python 去除列表中重复的元素(转载http://blog.csdn.net/zhengnz/article/details/6265282)

    比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a']l2 = list(set(l1))print l2   还有一种据说速度更快的,没测试过两者的速度 ...

  5. bzoj 2441 [中山市选2011]小W的问题

    bzoj 2441 [中山市选2011]小W的问题 Description 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个"W"出来.具 ...

  6. 牛客练习赛42A(字符串)

    传送门 结论是:一定是选取最长的那个AB连续子串. 把题面要求的a*b + a + b转化一下成(a + 1)*(b + 1) - 1,即可发现如果选取前缀后缀不连续的两段作为答案,则显然有更优解,即 ...

  7. struts2的@Result annotation 如何添加params,并且在页面取值

    http://www.bubuko.com/infodetail-2492575.html .............................................. 标签:lai  ...

  8. 关于foreach的一个BUG

    foreach用起来比for更方便,但是foreach隐藏的操作,可能带来更多未知的BUG,今天就遇到一个问题.编程环境VS2010 //使用foreach遍历,其中未改变item的值,但是使用了匿名 ...

  9. 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 ...

  10. 模拟IO 读写压力测试

    #### 本实验室通过创建一个测试表myTestTable ,分配在一个足够大小的表空间. ###然后通过 insert select 方式,创建100个后台进程进行读写操作,每个后台进程预计时间20 ...