这是我人生中第一个数据结构算法题,我就被杀祭了天,在此记录下以免被双杀!
一维数组转树状结构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)
请大佬们多多指教!