扁平数据结构转Tree

89 阅读1分钟

扁平数据结构转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();

参考