概念描述
- arr 排序(根据 parentId、id 升序排序)。
- 遍历arr
- 设置 arr 和 tree 的映射。
- 查找当前 item 的父节点,并给父节点设置 children
- 根节点赋值
代码实现
interface IArrayData {
id: number,
name: string,
parentId: number,
}
interface ITreeData extends IArrayData {
children?: IArrayData[]
}
function sortArr(arr: IArrayData[]): IArrayData[] {
return arr.sort((a: IArrayData, b: IArrayData) => {
if (a.parentId > b.parentId) {
return 1
} else if (a.parentId === b.parentId) {
return a.id - b.id
} else {
return -1
}
})
}
function arrToTree(arr: IArrayData[]): ITreeData | null {
const arrMapTree: Map<number, ITreeData> = new Map()
const tempArr = sortArr(arr)
let root: ITreeData | null = null
tempArr.forEach((item: IArrayData) => {
const { id, parentId } = item
arrMapTree.set(id, item)
const parentTree = arrMapTree.get(parentId)
if (parentTree) {
if (!parentTree.children) {
parentTree.children = []
}
parentTree.children.push(item)
}
if (parentId === 0) root = item
})
return root
}
const arrToTreeData: IArrayData[] = [
{ id: 4, name: '武昌区', parentId: 2 },
{ id: 5, name: '江岸区', parentId: 2 },
{ id: 1, name: '湖北省', parentId: 0 },
{ id: 2, name: '武汉市', parentId: 1 },
{ id: 3, name: '黄冈市', parentId: 1 },
{ id: 6, name: '黄州区', parentId: 3 }
]
const arrToTreeResult = arrToTree(arrToTreeData)
console.log('arrToTreeResult', arrToTreeResult)