js一维数组转树状结构

1,096 阅读1分钟
这是我人生中第一个数据结构算法题,我就被杀祭了天,在此记录下以免被双杀!

一维数组转树状结构2个关键点:双重循坏 + 递归

//原始数据
var arr = [    { id: 1, pid: '0' },    { id: 2, pid: '0' },    { id: 3, pid: '0' },    { id: 4, pid: '1' },    { id: 5, pid: '1' },    { id: 6, pid: '2' },    { id: 7, pid: '3' },    { id: 8, pid: '4' },    { id: 9, pid: '4' },    { id: 10, pid: '4' },    { id: 11, pid: '5' },    { id: 12, pid: '6' },    { id: 13, pid: '7' },    { id: 14, pid: '7' },    { id: 15, pid: '7' },    { id: 16, pid: '8' },    { id: 17, pid: '1' },    { id: 18, pid: '9' },    { id: 19, pid: '18' }]

//定义新数组,主要稍微优化下性能
let newArr = [];
//记录开始时间,发现执行时间有点诡异,有时执行只花0.4ms??? What? Why?
console.time()

//这是关键函数
function arrTotree(ret, a) {
    ret.forEach((outerItem) => {
        outerItem.children = [];
        newArr = [];
        a.forEach((item) => {
            count++;
            if (outerItem.id == item.pid) {
                outerItem.children.push(item);
            } else {
                newArr.push(item);
            }
        });

        !outerItem.length ? arrTotree(outerItem.children, newArr) : ''
    });
}
//初始化一个根节点,也可以不初始化,原理都是一样的,要学会灵活
let ret = [{ id: 0, pid: null }]
arrTotree(ret, arr);
console.timeEnd();
console.log(count)

请大佬们多多指教!