假設(shè)我們有一數(shù)據(jù)格式如下
let arr = [
{id: 1, name: '部門1', parentId: 0},
{id: 2, name: '部門2', parentId: 1},
{id: 3, name: '部門3', parentId: 1},
{id: 4, name: '部門4', parentId: 3},
{id: 5, name: '部門5', parentId: 4},
]
現(xiàn)在我們要將其轉(zhuǎn)換成一樹形結(jié)構(gòu)球恤,那么我們需要如何處理呢?
首先我們肯定想到通過遞歸方式來處理杯拐。代碼如下
function arr2tree(arr, parentId) {
let result = [];
// let resuison = function (arr, result, parentId) {
// arr.forEach(item => {
// if (item.parentId === parentId) {
// item.children = [];
// result.push(item);
// resuison(arr, item.children, item.id);
// }
// });
// }
// resuison(arr, result, 0);
// return result;
//或者
let resuison = function (arr, parentId) {
return arr.filter(item => {
return item.parentId === parentId
}).map(item=>{
item.children = resuison(arr,item.id);
return item
})
}
return resuison(arr,parentId);
}
但是以上兩種方法的時間復(fù)雜度皆為O(2^n)怪瓶。性能較差。所以我們可以換一種思路晤锹,主要思路是先把數(shù)據(jù)轉(zhuǎn)成Map去存儲摩幔,之后遍歷的同時借助對象的引用,直接從Map找對應(yīng)的數(shù)據(jù)做存儲鞭铆,代碼如下
function arr2tree(arr,rootParentId) {
let result = [];
let idMap = {};
// 將數(shù)據(jù)轉(zhuǎn)成map類型
arr.forEach(item => {
idMap[item.id] = {
...item,
children: []
};
});
// 循環(huán)數(shù)據(jù)或衡,通過對象的引用進(jìn)行處理
arr.forEach(item=>{
let {id,parentId} = item;
if(parentId === rootParentId) {
result.push(idMap[id]);
} else {
if(!idMap[parentId]) {
idMap[parentId] = {
children:[]
}
}
idMap[parentId].children.push(idMap[id]);
}
})
return result;
}
通過此方法,整個方法的時間復(fù)雜度為O(n)车遂。在面對大數(shù)據(jù)量的情況下封断,性能會好很多