使用antd的tree组件画树形结构(重点在于数据的处理)

二话不说先上代码

import _ from 'underscore'
import $ from 'jquery'

let spreadArr = []

//功能id树的方法
export function changeToTree(data,name,id) {
	//原始数据 名称数组 id数组
	return createTreeData(getAllNodes(data, name, id))
}

//统计日志树的方法
export function statisticsLogTree(data,name,id,sj,pipes) {
	//原始数据 名称数组 id数组 升降序的数组 展开的层数

	//获取总层数
	const pipesNum = id.length

	//为了保证最后树中所有的key唯一,用‘-’拼接
	let copyData = $.extend({}, true, data)
	let idArrList = []

	//对copyData进行排序
	for (let i = 1; i <= pipesNum; i++){
		if (sj[i - 1] == '1') {
			copyData[`listReturn${i}`].reverse()
		}
	}

	//修改id值 得修改所有的list 因为要取得顺序
	for (let i = 1; i <= pipesNum; i++) {
		copyData[`listReturn${i}`] = copyData[`listReturn${i}`].map((v) =>{
			for (let j = 1; j <= i; j++) {
				v[id[j - 1]] = (v[id[j - 2]] ? (v[id[j - 2]] + '-' + v[id[j - 1]]) : v[id[j - 1]]).toString()
			}
			return v
		})
	}

	//获取id的list 用来确定顺序
	for (let i = 1; i <= pipesNum; i++) {
		idArrList.push(_.uniq(_.pluck(copyData[`listReturn${i}`], id[i - 1])).filter(val=>val))
	}

	//把最后一层的数据先拿出来 最后要做树用
	let treeDate = copyData[`listReturn${pipesNum}`].map(item =>{
		return $.extend({}, true, item)
	})

	//循环把count拼到name中去
	for (let i = 1; i <= pipesNum; i++ ){
		copyData[`listReturn${i}`].map(v=>{
			treeDate.map((item, index) =>{
				if (v[id[i - 1]] == item[id[i - 1]]) {
					treeDate[index][name[i - 1]] = `${v[name[i - 1]]}  ${v.count}`
				}
			})
		})
	}

	//获取展开层数的节点key
	spreadArr = []
	for (let i = 0; i < pipes; i++ ){
		if (idArrList[i]) {
			spreadArr = [...spreadArr, ...idArrList[i]]
		}

	}

	let result = createTreeData(getAllNodes(treeDate, name, id, idArrList))
	result['spreadArr'] = spreadArr

	return result
}

function getAllNodes(data, nameArr, idArr, idArrList) {

	const targetArr = []
	let obj = {
		key: null,
		parent_key: null,
		title: null
	}

	let idList = []

	if (idArrList) {
		idList = idArrList
	} else {
		idList = idArr.map(item => {
			return _.uniq(_.pluck(data, item)).filter(val=>val)
		})
	}

	idList.map((item, index)=>{
		item.map(el=>{
			let flag = true
			data.map((item)=>{
				if (item[idArr[index]] === el && flag) {
					obj.key = el
					obj.title = item[nameArr[index]]
					if (index === 0) {
						obj.parent_key = '#'
					} else {
						if (!item[idArr[index - 1]]) {
							obj.parent_key = item[idArr[0]]
						} else {
							obj.parent_key = item[idArr[index - 1]]
						}
					}
					targetArr.push({...obj})
					flag = false
				}
			})

		})
	})


	return targetArr
}

function createTreeData(data) {
	let initData = {key:'#', children:[]}

	$.each(data, function(i, n) {
		n['children']=[];
		initData = initTreeData(initData, n);
	});

	return initData
}

function initTreeData(b, d) {
	if(b.key == d.parent_key) {
		b['children'].push(d);
		return b;
	}
	if(0 == b['children'].length) {
		return b;
	}
	$.each(b['children'], function(i, n) {
		b['children'][i]= initTreeData(b['children'][i], d);
	});
	return b;
}

主要方法解释

statisticsLogTree()该方法主要是讲后台返回的接口转换成需要的格式,比如:可能在title里显示总数;
getAllNodes()该方法主要是把数据拆分成一个一个小节,每一节都有自己的id,还有它的父id,还有他的children们;
createTreeData()这个方法就是组装树的过程,方法很简单,采用了递归的思想,从树的根部开始拼整棵树,如果有children就把此方法再递归调用,如此下来就可以拼成整个树!、
具体的代码实现,比较复杂的部分都写了注释。

猜你喜欢

转载自blog.csdn.net/weixin_43374193/article/details/85338054