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('/'); 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) } } } } return str } //获取一级节点Data function getFatherData(result) { var std = []; var str = []; for (var i in result) { var dir = result[i].bak.split('/'); 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; }