问题:如果后台给了一个这样的数据说让前端自己去转换为树形结构或者面试官给你一组这样的数据让你手写一个转换方法,你会怎么处理?
// [
// { 'id': '29', 'pid': '', 'name': '总裁办' },
// { 'id': '2c', 'pid': '', 'name': '财务部' },
// { 'id': '2d', 'pid': '2c', 'name': '财务核算部'},
// { 'id': '2f', 'pid': '2c', 'name': '薪资管理部'},
// { 'id': 'd2', 'pid': '', 'name': '技术部'},
// { 'id': 'd3', 'pid': 'd2', 'name': 'Java研发部'}
// ]
1、Map对象实现
function arraytoTree(list) {
const treeList = [] // 最终要产出的树状数据的数组
const map = {} // 存储映射关系
// 2. 建立一个映射关系,并给每个元素补充children属性.
// 映射关系: 目的是让我们能通过id快速找到对应的元素
// 补充children:让后边的计算更方便
list.forEach((item) => {
// if (!item.pid) {
item.children = []
// }
map[item.id] = item
})
// 3. 循环处理每个元素
list.forEach((item) => {
const pid = item.pid
const obj = map[pid]
// 如果存在则表示item不是最顶层的数据
if (obj) {
obj.children.push(item)
} else {
// 如果不存在 则是顶层数据
treeList.push(item)
}
})
// 返回出去
return treeList
}
2、filter实现
function arraytoTree2(list) {
// 返回每一项添加children属性后的返回值
const treeList = list.filter((item) => {
// 筛选 父级的id若与子级的pid相同 返回值 放入父级的children中
item.children = list.filter((child) => item.id === child.pid)
return list
})
return treeList
}
3、递归实现
function arraytoTree2(list) {
// 递归查找获取子节点
const getChild = (list, result, pid) => {
list.forEach((item) => {
if (item.pid == pid) {
const newItem = { ...item, children: [] }
result.push(newItem)
getChild(list, newItem.children, item.id)
}
})
}
// 调用递归实现
const treeList = (list, pid) => {
const result = []
getChild(list, result, pid)
return result
}
return treeList(list, 0)
}
未完待续:树形结构转换为数组