前端使用
/**
* 构造树型结构数据
* @param {*} data 数据源
* @param {*} depid 儿子节点id字段 默认 'depid'
* @param {*} parentId 父节点id字段 默认 'parentId'
* @param {*} children 孩子节点数据存储字段 默认 'children'
* @param {*} rootId 根Id 默认 0
*/
export function handleTree(data, depid, parentId, children, rootId) {
depid = depid || 'depid'
parentId = parentId || 'parentId'
children = children || 'children'
rootId = rootId || 0
//对源数据深度克隆
const cloneData = JSON.parse(JSON.stringify(data))
//循环所有项
const treeData = cloneData.filter(father => {
let branchArr = cloneData.filter(child => {
//过滤每一项的子级数组然后返回
return father[depid] == child[parentId]
});
branchArr.length > 0 ? father.children = branchArr : '';
//返回第一层
return parseInt(father[parentId]) == rootId;
});
return treeData != '' ? treeData : data;
}
后端使用
public List<TreeSelect> buildDeptTreeSelect(List<Dept> depts)
{
List<Dept> deptTrees = buildDeptTree(depts);
return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
}
/**
* 构建前端所需要树结构
*
* @param depts 部门列表
* @return 树结构列表
*/
@Override
public List<Dept> buildDeptTree(List<Dept> depts)
{
List<Dept> returnList = new ArrayList<Dept>();
List<String> tempList = new ArrayList<String>();
for (Dept dept : depts)
{
tempList.add(dept.getDeptId());
}
for (Iterator<Dept> iterator = depts.iterator(); iterator.hasNext();)
{
Dept dept = (Dept) iterator.next();
// 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(dept.getParentId()))
{
recursionFn(depts, dept);
returnList.add(dept);
}
}
if (returnList.isEmpty())
{
returnList = depts;
}
return returnList;
}