const list = [
{ 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: "运维工程师" }
]
方法一 递归
// 作用:找到pid为指定rootId的所有元素,并返回
function findChildren(list, rootId = '') {
const children = []
// 对于list中,每个元素。
// 如果它的pid === rootId,它就是当前的children
// 如果不是
list.forEach(item => {
if (item.pid === rootId) {
children.push(item)
item.children = findChildren(list, item.id)
}
})
return children
}
console.log(findChildren(list));
方法二
function toTree(list) {
let cloneData = JSON.parse(JSON.stringify(list)) // 对源数据深度克隆
let tree = cloneData.filter((father) => { //循环所有项
let branchArr = cloneData.filter((child) => {
return father.id == child.pid;//返回每一项的子级数组
});
if (branchArr.length > 0) {
father.children = branchArr; //如果存在子级,则给父级添加一个children属性,并赋值
}
return father.pid == 0;//返回第一层
});
return tree; //返回树形数据
}
var tree = toTree(list);
console.log(tree);