// 方法一 常规思路 递归
toTree(arr){
// 这个就是一级数组 最后上面的数组只有三个是一级的
const parentA = arr.filter(item => !item.parentId);
const childA = arr.filter(item => item.parentId);
/** 这个就是小蝌蚪找妈妈的具体实现,其实可以写在一个函数里面,
但是为了易懂,就麻烦点儿摘出来一个函数 **/
this.treeData(parentA, childA)
return parentA;
},
treeData(parentA, childA) {
for (const item of parentA) {
item.children = []
for (const i in childA) {
const v = childA[i];
if (item.id === v.parentId) {
item.children.push(v);
// 这一步递归 如果没有下面三行代码 只能找到第一级对应的children第二级目录
let c = JSON.parse(JSON.stringify(childA)); // 简单深拷贝一下
// 能走到这儿,说明这个娃 已经找到父亲了 不需要在遍历了 所以删了 你要是非的不删也可以
// 注意这里是具体根据业务的,如果不同父目录下面可能有相同的子目录,这里就不能删除了
c.splice(i, 1);
// 这里需要把当前儿子 加上【】转为数组因为treeData接受的是父,子数组
this.treeData([v], c);
}
}
}
},
方法二 扁平化处理(写成公共的方法)
// 调用
this.deptOptionsData = []
this.deptOptionsData .push(...this.handleTree(response.data, "id"));
// 调用 结束
export function handleTree(data, id, parentId, children, rootId) {
data = data.map(item => ({ ...item, parentId: item.parentId === "0" ? 0 : item.parentId }));
id = id || 'id'
parentId = parentId || 'parentId'
children = children || 'children'
rootId = rootId || Math.min.apply(Math, data.map(item => {
return item[parentId]
})) || 0
//对源数据深度克隆
const cloneData = JSON.parse(JSON.stringify(data))
//循环所有项
const treeData = cloneData.filter(father => {
let branchArr = cloneData.filter(child => {
//返回每一项的子级数组
return father[id] === child[parentId]
});
branchArr.length > 0 ? father.children = branchArr : '';
//返回第一层
return father[parentId] === rootId;
});
return treeData !== '' ? treeData : data;
}