实现数组转换为有层级的对象
const data = [
{ id: '01', name: '张大大', pid: '', job: '项目经理' },
{ id: '02', name: '小亮', pid: '01', job: '产品leader' },
{ id: '03', name: '小美', pid: '01', job: 'UIleader' },
{ id: '04', name: '老马', pid: '01', job: '技术leader' },
{ id: '05', name: '老王', pid: '01', job: '测试leader' },
{ id: '06', name: '老李', pid: '01', job: '运维leader' },
{ id: '07', name: '小丽', pid: '02', job: '产品经理' },
{ id: '08', name: '大光', pid: '02', job: '产品经理' },
{ id: '09', name: '小高', pid: '03', job: 'UI设计师' },
{ id: '10', name: '小刘', pid: '04', job: '前端工程师' },
{ id: '11', name: '小华', pid: '04', job: '后端工程师' },
{ id: '12', name: '小李', pid: '04', job: '后端工程师' },
{ id: '13', name: '小赵', pid: '05', job: '测试工程师' },
{ id: '14', name: '小强', pid: '05', job: '测试工程师' },
{ id: '15', name: '小涛', pid: '06', job: '运维工程师' }
]
转换为 :
const treeData = [
// treeData就是:
{
label: '张大大',
children: [
{
label: '小亮',
children: [{ label: '小丽' }, { label: '大光' }],
},
{
label: '小美',
children: [{ label: '小高' }],
},
{
label: '老马',
children: [{ label: '小刘' }, { label: '小华' }, { label: '小李' }],
},
{
label: '老王',
children: [{ label: '小赵' }, { label: '小强' }],
},
{
label: '老李',
children: [{ label: '小涛' }],
},
],
},
]
方法一 递归
function dataToChange(data, pid) {
const tree = []
let tem = ''
for (let i = 0; i < data.length; i++) {
// console.log(data[i].pid)
if (data[i].pid === pid) {
const obj = {}
for (const k in data[i]) {
obj[k] = data[i][k]
}
tem = dataToChange(data, data[i].id) // tem 是空数组或者是二级的元素
if (tem.length > 0) {
// 判断 如果头长度 则是二级 ,插入到一级子节点中
obj.children = tem
}
tree.push(obj)
}
// console.log(data[i].id)
}
return tree
方法二:
function dataToChange(data) {
// 1. 定义两个变量
const tree = [], map = {}
// 2. 建立一个映射关系,并给每个元素补充children属性.
// 映射关系: 目的是让我们能通过id快速找到对应的元素
// 补充children:让后边的计算更方便
list.forEach(item => {
if (!item.children) {
item.children = []
}
map[item.id] = item
})
// 循环
list.forEach(item => {
// 对于每一个元素来说,先找它的上级
// 如果能找到,说明它有上级,则要把它添加到上级的children中去
// 如果找不到,说明它没有上级,直接添加到 treeList
const parent = map[item.pid]
// 如果存在上级则表示item不是最顶层的数据
if (parent) {
parent.children.push(item)
} else {
// 如果不存在上级 则是顶层数据,直接添加
treeList.push(item)
}
})
// 返回
return tree
}