将对象数组转换为树结构,parentId
等于父节点的id
,若parentId
为0
,则此节点为父节点
let arr = [
{ id: 1, name: '陕西',parentId: 0},
{ id: 2, name: '山西',parentId: 0},
{ id: 3, name: '四川',parentId: 0},
{ id: 4, name: '西安',parentId: 1},
{ id: 5, name: '咸阳',parentId: 1},
{ id: 6, name: '渭南',parentId: 1},
{ id: 7, name: '侯马',parentId: 2},
{ id: 8, name: '雅安',parentId: 3},
]
function toTree(){
let obj = {}
let brr = []
arr.forEach( item => {
obj[item.id] = item
})
/*obj = {1:{ id: 1, name: '陕西',parentId: 0},
2:{ id: 2, name: '山西',parentId: 0},
3:{ id: 3, name: '四川',parentId: 0},
4:{ id: 4, name: '西安',parentId: 1},
5:{ id: 5, name: '咸阳',parentId: 1},
6:{ id: 6, name: '渭南',parentId: 1},
7:{ id: 7, name: '侯马',parentId: 2},
8:{ id: 8, name: '雅安',parentId: 3},
}*/
arr.forEach( item => {
let parent = obj[item.parentId]
/*parent =
undefined,//这是第一次的结果
undefined,//二
undefined,//三
{ id: 1, name: '陕西',parentId: 0},//四
*/
if(parent){
//第四次的时候,走到这个判断中,给{ id: 1, name: '陕西',parentId: 0}对象添加一个属性children,值为item
(parent.children || (parent.children = [])).push(item)
}else{
//前三次的时候走到这个分支
brr.push(item)
}
})
return brr
}
console.log(toTree(arr))
//结果
[
{ id: 1,
name: '陕西',
parentId: 0
children:[
{ id: 4, name: '西安',parentId: 1},
{ id: 5, name: '咸阳',parentId: 1},
{ id: 6, name: '渭南',parentId: 1},
]},
{
id: 2,
name: '山西',
parentId: 0
children:[
{ id: 7, name: '侯马',parentId: 2},
]},
{ id: 3,
name: '四川',
parentId: 0,
children:[
{ id: 8, name: '雅安',parentId: 3},
]},
]