对tree的数据重新组织,嵌套或者拉平
export class FileNode {
treeChildren: FileNode[];
treeFilename: string;
treeType: any;
[key: string]: any;
}
export class FileFlatNode {
[key: string]: any;
constructor(
public treeExpandable: boolean,
public treeFilename: string,
public treeLevel: number,
public treeType: any
) {
}
}
// 将数据重新组织成一个嵌套的tree
export const buildFileTree = (arr: any[]): FileNode[] => {
return arr.reduce((pre, cur, index, arr) => {
const node = new FileNode();
node.treeFilename = cur.Name;
for (const key in cur) {
if (key !== 'ChildNode') {
node[key] = cur[key];
}
}
if (cur.ChildNode && cur.ChildNode.length) {
node.treeChildren = buildFileTree(cur.ChildNode);
}
return pre.concat(node); // 将node合并到上一个pre数组中
}, []); // pre 的初始值为[]
};
// 将数据重新组织,将子节点取出来放在和父节点平衡的数组里面,拉平成一个不嵌套的tree
export const buildFileFlatTree = (arr: any[], level: number, type: any = null): FileFlatNode[] => {
return arr.reduce((pre, cur, index, arr) => {
const node = new FileFlatNode(!!cur.ChildNode, cur.name, level, type);
node.treeLevel = level;
for (const key in cur) {
if (key !== 'ChildNode') {
node[key] = cur[key];
}
}
let _pre = pre.concat(node);
if (cur.ChildNode && cur.ChildNode.length) {
_pre = _pre.concat(buildFileFlatTree(cur.ChildNode, level + 1, cur.name));
}
return _pre;
}, []);
};
根据子元素的guid获取所有父级的guid(注:guid不可重复)reduce方法虽然使用起来方便,但是ie9以下不支持reduce
// 逆序,获取当前部门的所有父元素的guid
function getParentsId(arr, PK_Guid) {
var idArr = [];
var fns = function(arr){
for (const item of arr) {
if (item.PK_Guid == PK_Guid) {
idArr.push(item.PK_Guid);
break;
}
if (item.ChildNode) {
if (JSON.stringify(item.ChildNode).match(PK_Guid)) {
idArr.push(item.PK_Guid);
}
fns(item.ChildNode);
}
}
}
fns(arr)
return idArr;
}
根据id获取当前架构信息以及下级信息
function getOneInfo(data,id){
let obj = null;
function fn(data,id){
for(const item of data){
if(item.PK_Guid === id){
obj = item;
break;
}
if(item.ChildNode&&item.ChildNode.length){
fn(item.ChildNode,id)
}
}
}
fn(data,id);
return obj;
}
数据结构:
var data = [{
PK_Guid:'1a',
name:'1',
ChildNode:[
{PK_Guid:'11b',name:'11'},
{PK_Guid:'12b',name:'12',
ChildNode:[
{PK_Guid:'121c',name:'121',
ChildNode:[
{PK_Guid:'1211d',name:'1211'},
{PK_Guid:'1222d',name:'1222'},
]
},
{PK_Guid:'122c',name:'122'},
]
},
{PK_Guid:'13b',name:'13'},
]
}]
buildFileTree 运行结果:
buildFileFlatTree运行结果:
getParentsId运行结果:
getOneInfo运行结果: