|
|
var num = -1;
|
var tree = [];
|
//获取目录树数据
|
export function getTreeData(result) {
|
|
tree = [];
|
num = -1
|
var val = JSON.parse(JSON.stringify(result));
|
//获取一级菜单
|
var fdata = getFatherData(val);
|
//获取一级菜单下所有子级菜单
|
var cdata = getChildData(val, fdata);
|
|
for (var i in fdata) {
|
tree.push(fdata[i])
|
}
|
for (var i in cdata) {
|
tree.push(cdata[i])
|
}
|
var tree_Data = [];
|
for (var i in cdata) {
|
for (var j in val) {
|
if (val[j].bak == cdata[i].bak) {
|
num++;
|
val[j].label = val[j].tabDesc;
|
val[j].pid = cdata[i].id;
|
val[j].id = num;
|
var valData = tree_Data.filter(rs => {
|
if (rs.label == val[j].label && rs.bak == val[j].bak) {
|
return rs
|
}
|
})
|
if (valData.length == 0) {
|
tree_Data.push(val[j])
|
}
|
}
|
}
|
}
|
for (var i in tree_Data) {
|
tree.push(tree_Data[i])
|
}
|
|
var tree_data = setTreeData(tree);
|
|
return tree_data
|
|
|
}
|
//生成递归数据
|
function setTreeData(source) {
|
let cloneData = JSON.parse(JSON.stringify(source));// 对源数据深度克隆
|
|
return cloneData.filter((father) => {
|
// 循环所有项
|
|
let branchArr = cloneData.filter((child) => father.id === child.pid); // 对比ID,分别上下级菜单,并返回数据
|
branchArr.length > 0 ? (father.children = branchArr) : ''; // 给父级添加一个children属性,并赋值
|
// 属于同一对象问题,例如:令 a=b、c=1 ,然后再令 b.c=c , 那么 a.c=b.c=c=1 ;同理,后续令 c.d=2 ,那么 a.c.d 也是=2;
|
// 由此循环多次后,就能形成相应的树形数据结构
|
return father.pid == -1; // 返回一级菜单
|
});
|
|
}
|
//获取一级菜单下子级菜单
|
function getChildData(result, res) {
|
var std = [];
|
|
for (var i in result) {
|
let dir = result[i].bak;
|
let c_filter = dataFilter(std, dir);
|
if (c_filter.length == 0) {
|
std.push(dir);
|
}
|
}
|
|
var str = [];
|
|
for (var i in std) {
|
let dir = std[i].split('/');
|
if (dir.length > 1) {
|
for (var j = 1; j < dir.length; j++) {
|
if (j == 1) {
|
var clabel = dir[0] + "/" + dir[j]
|
let f_val = res.filter((rs) => {
|
if (rs.label === dir[j - 1]) {
|
return rs;
|
}
|
})
|
var c_Data = str.filter(rs => {
|
if (rs.bak == clabel) {
|
return rs;
|
}
|
})
|
if (f_val.length != 0 && c_Data.length == 0) {
|
num++;
|
var val = {
|
id: num,
|
pid: f_val[0].id,
|
label: dir[j],
|
bak: clabel
|
}
|
str.push(val)
|
}
|
|
} else {
|
var clabel1 = dir[0]
|
for (var k = 1; k < j; k++) {
|
clabel1 = clabel1 + "/" + dir[k];
|
}
|
var f_val = [];
|
for (var w in str) {
|
if (str[w].label == dir[j - 1]) {
|
if (str[w].bak == clabel1) {
|
f_val.push(str[w])
|
}
|
}
|
}
|
var clabel2 = clabel1 + "/" + dir[j]
|
var c_Data = str.filter(rs => {
|
if (rs.bak == clabel2) {
|
return rs;
|
}
|
})
|
if (f_val.length != 0 && c_Data.length == 0) {
|
num++;
|
var val = {
|
id: num,
|
pid: f_val[0].id,
|
label: dir[j],
|
bak: clabel2
|
}
|
str.push(val)
|
}
|
}
|
}
|
} else {
|
num++;
|
var val = {
|
id: num,
|
pid: -1,
|
label: dir[0],
|
bak: dir[0]
|
}
|
str.push(val)
|
|
|
}
|
|
}
|
|
return str
|
|
|
}
|
|
//获取一级节点Data
|
function getFatherData(result) {
|
var std = [];
|
var str = [];
|
for (var i in result) {
|
var dir = result[i].bak.split('/');
|
if (dir.length > 1) {
|
var f_filter = dataFilter(std, dir[0]);
|
|
if (f_filter.length == 0) {
|
std.push(dir[0])
|
num++
|
str.push({
|
id: num,
|
pid: -1,
|
label: dir[0]
|
})
|
}
|
}
|
|
}
|
|
return str;
|
}
|
//遍历匹配获取数据
|
function dataFilter(result, bak) {
|
let val = result.filter(res => {
|
|
if (res == bak) {
|
return res;
|
}
|
})
|
|
return val;
|
}
|