扁平数据结构转Tree
递归方式
function run(data, result, pid){
for(const item of data){
if(item.pid === pid){
const newitem = {...item, children: []};
result.push(newitem);
run(data, newitem.children, item.id);
}
}
}
function main() {
arr = [
{pid:null, id:'1', name:'a区'},
{pid:'1', id:'1-1', name:'b区'},
{pid:'1', id:'1-2', name:'b区'},
{pid:'1-1', id:'1-1-1', name:'d区'},
{pid:'1-2', id:'1-2-1', name:'e区'},
{pid:'1-1-1', id:'1-1-1-1', name:'f区'},
{pid:'1-1-1', id:'1-1-1-2', name:'g区'},
];
let result = [];
run(arr, result, null);
console.log(JSON.stringify(result[0]));
}
main();
迭代方式
function run(data){
const itemmap = new Map();
for(const item of data){
itemmap[item.id] = {...item, children: []}
}
const result = [];
for(const item of data){
const pid = item.pid;
const id = item.id;
const treeitem = itemmap[id];
if(pid === null){
result.push(treeitem);
}else{
if(!itemmap[pid]){
itemmap[pid] = {children: []};
}
itemmap[pid].children.push(treeitem);
}
}
return result
}
function main() {
arr = [
{pid:null, id:'1', name:'a区'},
{pid:'1', id:'1-1', name:'b区'},
{pid:'1', id:'1-2', name:'b区'},
{pid:'1-1', id:'1-1-1', name:'d区'},
{pid:'1-2', id:'1-2-1', name:'e区'},
{pid:'1-1-1', id:'1-1-1-1', name:'f区'},
{pid:'1-1-1', id:'1-1-1-2', name:'g区'},
];
let result = run(arr);
console.log(JSON.stringify(result[0]));
}
main();
参考