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

[{ 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
}

转载于:https://www.cnblogs.com/wjs0509/p/11082850.html

使用js将后台返回的数据转换成树形结构相关推荐

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

    下载地址 csdn下载地址 服务端数据存储 当有多级菜单或者多级部门这样的场景的时候,传统的结构化数据设计都会用类似parentId来标识其父级,以达到多级树形结构存储于数据库中 服务端提供接口 服务 ...

  2. js 把线性的数据结构改成树形结构

    把数组的数据结构改成树形结构. var aaa = [{name:"111", id: 1, pId: 0, children: []},{name:"222" ...

  3. java 通用扁平数据转换成树形结构

    大家好,我是入错行的bug猫.(http://blog.csdn.net/qq_41399429,谢绝转载) 所谓树形结构,就是上级节点中,包含若干子节点,然后子节点中又包含其子节点,一般是没有层级次 ...

  4. 将数据库查询出来的数据转化成树形结构

    从数据库查询的每一条数据都包含id和fid字段,将获得的数据转换成树形结构 假设从数据库查询出来的数据对应的实体类: public class department {private int id;p ...

  5. 如何将数据库中text字段中返回的数据转换成数组的形式,并且将字符串的数字转换成数字的形式显示

    如何将数据库中text字段中返回的数据转换成数组的形式,并且将字符串的数字转换成数字的形式显示 数据库text字段 数据库中的text字段在前端 界面返回的时候是成字符串的形式的,类似于下图 那么,在 ...

  6. JS 如何快速高效的将数组转换成树形结构

    JS 如何快速高效的将数组转换成树形结构 const data = [{id: 1,pid: 0,name: 'body'}, {id: 2,pid: 1,name: 'title'}, {id: 3 ...

  7. python画父子关系图_将有父子关系的一维数组转换成树形结构(多维)数据

    先来个函数注释 : /** * 将有父子关系的一维数组转换成树形结构(多维)数据 * console.log(JSON.stringify(setTreeData(data), null, 2)); ...

  8. mysql 父子维,将有父子关系的一维数组转换成树形结构(多维)数据

    拉莫斯之舞 先来个函数注释 :/** * 将有父子关系的一维数组转换成树形结构(多维)数据 * console.log(JSON.stringify(setTreeData(data), null,  ...

  9. 【每日积累】JS将后台返回的Unix时间戳转换成YYYY-MM-DD

    1.问题重现          后台返回的时间格式 2.解决方案:                   function getYMDHMS(obj) {let unixtime = obj;let ...

最新文章

  1. R语言绘制环状条形图
  2. ICA--独立成分分析(Independent Component Analysis)
  3. python恶搞表情包-Python自动生成表情包,python在手,从此斗图无敌手
  4. LeetCode10.正则表达式匹配 JavaScript
  5. spring 定时任务执行两次解决办法
  6. linux进程端口防火墙
  7. ABAP Write 宝典
  8. web前端教程:如何理解JavaScript的单线程?
  9. 941. Valid Mountain Array 有效的山脉数组
  10. 修改value_Python | 快速修改或命名N个文件夹名称,你会吗?
  11. matlab 向前欧拉公式,向前欧拉公式在Matlab解微分方程初值解的问题
  12. 最新房天下登录接口(RSA)JS逆向分析
  13. 微信messageutil.java_java微信公众平台开发回复文本消息
  14. 23种设计模式(6):模版方法模式
  15. 韩顺平php开发合集208集-从Html基础到php开发Web QQ实战 共15G
  16. 南非认证_南非2008-与孩子和婴儿长途旅行
  17. html为知笔记模板,为知笔记使用技巧:如何建立模板
  18. html标签属性大全(囊括CSS、CSS3、H5、XML等)
  19. Android使用TextToSpeech实现语音播报-及默认不支持中文的方案
  20. 医学统计学 第五章(定性资料的统计描述)

热门文章

  1. c语言每次堆的变化是1k,DSPXC语言+程序烧写讲述.ppt
  2. 图像融合亮度一致_重磅干货低光图像处理方案
  3. rust的权限柜怎么做_潍坊装修知识~二胎家庭不做上下铺,把两张床靠墙放,中间做收纳柜,你感觉怎么样?...
  4. m_map投影_MATLAB使用m_map工具箱演示绘制m_map logo
  5. python元组取值_Python基础之元组
  6. docker java mysql_Docker 搭建 MySQL 服务
  7. java中content啥意思_JSTL标签中的body-content标签体内容输出格式的介绍
  8. 纵横免root框架打不开应用怎么办_很好用的软件多开神奇安卓欧皇十框架!!!...
  9. cad 怎么显示块句柄_cad怎么显示工具栏
  10. java web容器原理_javaWeb工作原理