组织架构tree目录的一些常用方法

 对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运行结果:

发布了112 篇原创文章 · 获赞 149 · 访问量 55万+

猜你喜欢

转载自blog.csdn.net/l284969634/article/details/103469242