怎样将一个平铺的数组结构转换成一个树形的数组结构
在前端处理后台发送过来的数据时,后端接口返回的数据一般是平铺的数组结构,而不会是树形结构,例如下面的平铺数组结构:
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: "运维工程师"
}
]
此类的数据可以在table中使用,但不能直接在tree组件中使用,要使用的话需要做一些转换,变成树状的数组结构。
data: [{
label: '张大大',
children: [
{
label: '小亮',
children: [{label: '小丽'},{label: '大光'}]
},
{
label: '小美',
children: [{label: '小高'}]
},
{
label: '老马',
children: [{label: '小刘'},{label: '小华'},{label: '小李'}]
},
{
label: '老王',
children: [{label: '小赵'},{label: '小强'}]
},
{
label: '老李',
children: [{label: '小涛'}]
}
]
}]
``
可以使用双重循环遍历
在第一次循环id值,第二次循环pid值
function toTree(data) {
// 空数组
let result = [];
// 判断不是数组 直接返回
if (!Array.isArray(data)) {
return result
}
// 遍历 删除 children 属性 做初始化操作
data.forEach(item => {
delete item.job
item.label = item.name
delete item.name
});
// 空对象
let map = {};
data.forEach(item => {
map[item.id] = item;
});
data.forEach(item => {
// item.pid 为0时 返回underfined
let parent = map[item.pid];
if (parent) {
(parent.children || (parent.children = [])).push(item);
} else {
// 这里push的item是pid为0的数据
result.push(item);
}
});
return result;
}