扁平结构转化为树结构
function flatToTree(datas, key_id = 'id', key_pid = 'parent_id') {
const resultMap = {}
const result = []
//循环flat数组将所有数据存在map中,方便后续查找
for (let data of datas) {
resultMap[[data[key_id]]] = data
}
for (let data of datas) {
const id = data[key_id]
const pid = data[key_pid]
const mapData = resultMap[id]
if (resultMap[pid]) {
if (!resultMap[pid].children) {
resultMap[pid].children = []
}
resultMap[pid].children.push(mapData)
} else {
result.push(mapData)
}
}
return result
}
树结构转化为扁平结构
treeToFlat(treeArr: any): object[] {
const tree = cloneDeep(treeArr)
const res: object[] = []
const getFloatStructore = (tree: any, res: object[]) => {
tree.forEach((item: any) => {
if (item.children && item.children.length > 0) {
getFloatStructore(item.children, res)
}
delete item.children
res.push(item)
return
})
}
getFloatStructore(tree, res)
return res
},
获取当前id的所有父级,flatArr为扁平结构数据
function getParentIds(flatArr, id) {
const result = []
const dataMap = {}
for (let data of flatArr) {
dataMap[data['id']] = data
}
let data = dataMap[id]
while (dataMap[data['parent_id']]) {
result.push(data['parent_id'])
data = dataMap[data['parent_id']]
}
return result.reverse()
}
获取tree结构的某一节点下的所有子节点
getTreeChildIds(child: any): number[] {
const ids: number[] = [child.id]
const getIds = (children: any, ids: number[]) => {
for (let i = 0
const child = children[i]
ids.push(child.id)
if (child.children && child.children.length > 0) {
getIds(child.children, ids)
}
}
}
child.children ? getIds(child.children, ids) : undefined
return ids
},
获取树的高度
getLevel(tree: any) {
let maxLevel = 0
if (!tree.children) {
return 0
}
(function callBack(arr, level) {
const newLevel = level + 1
maxLevel = Math.max(newLevel, maxLevel)
for (let i = 0
const item = arr[i]
if (item.children && item.children.length > 0) {
callBack(item.children, newLevel)
} else {
delete item.children
}
}
})(tree.children, 0)
return maxLevel
},
}