假如有个需求,是如下结构:

let arr = [{id: 1, name: '部门1', pid: 0},{id: 2, name: '部门2', pid: 1},{id: 3, name: '部门3', pid: 1},{id: 4, name: '部门4', pid: 3},{id: 5, name: '部门5', pid: 4},
]

通过pid这个字段,要转成树结构,就是这样:

[{"id": 1,"name": "部门1","pid": 0,"children": [{"id": 2,"name": "部门2","pid": 1,"children": []},{"id": 3,"name": "部门3","pid": 1,"children": [{"id": 4,"name": "部门4","pid": 3,"children": [{"id": 5,"name": "部门5","pid": 4,"children": []}]}]}]}
]

思路如下:

先把数据转成Map形式去存储,再去遍历这个Map找到对应的数据,完整代码:

let arr = [{id: 1, name: '部门1', pid: 0},{id: 2, name: '部门2', pid: 1},{id: 3, name: '部门3', pid: 1},{id: 4, name: '部门4', pid: 3},{id: 5, name: '部门5', pid: 4},
]
let result = []
let trees = {}// 遍历给每一个对象添加一个children属性并转换成Map形式;并添加进trees对象,id为键
arr.forEach(item => {item.children = []trees[item.id] = item
})// 遍历查找对应的Map做存储
arr.forEach(item => {// 找到pid不为0的对象if(trees[item.pid]){// 因为pid对应的父节点是id,所以通过pid找到父节点再把当前的对象添加进入子数组里面trees[item.pid].children.push(item)}// 把pid为0的对象添加进最终的数组result,做为父节点if(item.pid == 0){// item是引用类型(浅拷贝),针对当前数据所以只需push一次到resultresult.push(item)}
})

但是目前这个有个缺点,就是假如有两个父节点,就会有问题,因为这里是用的pid===0来判断的,更完整的如下:

// 假设有如下数据,需要转成树结构:
let arr = [{ id: 1, parentId: null, name: 'a' },{ id: 2, parentId: null, name: 'b' },{ id: 3, parentId: 1, name: 'c' },{ id: 4, parentId: 2, name: 'd' },{ id: 5, parentId: 1, name: 'e' },{ id: 6, parentId: 3, name: 'f' },{ id: 7, parentId: 4, name: 'g' },{ id: 8, parentId: 7, name: 'h' },
]// 定义最终输出的数组
let trees = []// 定义一个map
let map = new Map()// 遍历源数组,给map添加数据
for (let v of arr){// set(key,value)方法:  向当前Map对象中添加一个值,返回的Map对象,所以支持链式写法map.set(v.id, v)
}for (let v of arr){const pId = v.parentId// 方法has(key) 返回一个bool值,用来表明map 中是否存在指定元素.// 如果map中不存在当前元素parentId,则该元素为根元素,当前数据针对null,是不存在的if (!map.has(pId)) {// push的对象是引用类型(浅拷贝)trees.push(v)}// 如果map中存在 当前元素的parentId,则该元素不为根元素else {// get(key)    通过key找到value,如果找不到,返回undefinedconst parent = map.get(pId)// instanceof方法:用于判断一个变量是否某个对象的实例// 这里的意思是:如果parent没有children这个字段或者不是一个数组,则手动添加一个children属性为空数组!(parent.children instanceof Array) && (parent.children = [])parent.children.push(v)}
}
console.log(trees)

js扁平数组对象转成树结构相关推荐

  1. js检测数组对象中是否有重复值

    判断数组对象里的某个值是否都是同一个值 isRepeat=(arr)=> {var hash = {};for(let i=0;i<arr.length;i++){if (!hash[ar ...

  2. Python学习 Day31 JS类数组对象

    JS类数组对象 一.三元运算符 概述:三元运算符由三部分组成,使用语法如下: A ? B : C 三元运算符A:它需要的是一个布尔值(其他类型数值也可以,但是需要隐式转换为布尔值) 如果A部分为布尔值 ...

  3. js给数组添加数据的方式/js 向数组对象中添加属性和属性值

    参考:https://www.cnblogs.com/ayaa/p/14732349.html js给数组添加数据的方式有以下几种: 直接利用数组下标赋值来增加(数组的下标起始值是0) 例,先存在一个 ...

  4. 动态js创建数组对象

    动态js创建数组对象 var items = []; for (var i = 0; i < 10; i++) { items.push({ id: i, level: i + '级' }) }

  5. js前端数组对象键大写下划线转驼峰

    js前端数组对象键大写下划线转驼峰 我是分为两步去进行转的 第一步,先将对象的键从大写转换为小写 第二步,再将下划线转为驼峰格式 1.大写转小写代码参考如下 upLowercase(inputObj) ...

  6. js实现数组对象去重

    数组对象去重,可直接复用 /***数组对象去重** @param {Array} arr 去重数组* @param {String} key 唯一标识*/ deduplication(arr, key ...

  7. JS 对数组对象进行排序

    对Number类型的数组排序是很简单的,对数组元素为对象的数组进行排序也很简单,可以写一个下面的公共方法 /** 两个参数: 参数1 是排序用的字段, 参数2 是:是否升序排序 true 为升序,fa ...

  8. JS在数组对象中添加新字段

    在数组对象中每一项都添加相同字段 第一步使用forEach遍历数组 然后通过Object.assign()来添加 var arr = [{age:18,sex:'女'}, {age:30,sex:'男 ...

  9. JS删除数组对象中指定元素对应的对象

    这里我采用的是过滤的方法(filter),先将数组对象中的指定元素匹配上,然后在将它过滤出来,获取到剩下的对象,将剩下的对象拿到,这样就实现了删除指定元素对应的对象的效果. 举个栗子: 首先定义一个数 ...

  10. js删除数组对象中的某个属性的方法

    模拟数组对象数据 let newArr = [{title:'小明', id:18},{title:'小红', id:16}] 方式一:(for循环)删除数组对象中的某个属性,如删除id属性 for ...

最新文章

  1. 【c语言】求三个数的和
  2. 浅谈DevExpress六:为chart创建动态数据源
  3. 微软职位内部推荐-Senior PM
  4. eclipse中java.lang.OutOfMemoryError: Java heap space错误
  5. B站发布51部国创作品新内容 公布《三体》动画新PV
  6. 【Elasticsearch】zen discovery集群发现机制
  7. Asp.net 调用sqlserver存储过程参数传中文乱码!
  8. perl 切换 dnspod 域名记录
  9. typeof的用法 typeof的返回值是一个字符串 返回的字符串类别
  10. 十款最好用的远程桌面工具
  11. Cinema 4d 软件介绍
  12. bind服务器响应,DNS和Bind服务器
  13. Mac 使用U盘重装系统
  14. 字根校对-中文校对软件
  15. vba宏是什么,如何操作
  16. TFP-161/100/6MM/6MM/MPU
  17. java web属于什么语言_java web开发是什么
  18. 笑话集网站最近更新网站内容采集
  19. Django中DateField与DateTimeField的特殊参数auto_add_now和auto_now
  20. idea下载源码失败 cannot download sources

热门文章

  1. CFS中一些调度参数的实现原理
  2. mysql res.body_请帮我找一下错吧:body ?php $link=mysql_connect('localhost','root','123') or die (不能连接数据库...
  3. JAVA--set用法
  4. 深度学习优化算法大全系列6:Adam
  5. java中的T extends Comparable ? super T
  6. 使用匿名内部类排序对象
  7. java 子串替换_Java中的多个同时子串替换
  8. imu 里程计融合_多传感器融合 RLINS概述
  9. 数据结构c语言版算法知识点,2020考研计算机《数据结构(C语言版)》复习笔记(3)...
  10. java iecapt.exe_IECapt生成网页快照IECapt.exe下载 CutyCapt