直接上代码:
function arrayToTree(array, id=1, data={ id: 1, pid: 0 }) {
// 默认父节点为1, data 为 {}
let result = [];
for (let arr of array) {//循环获取子节点
if (arr.pid == id) {
result.push(arr);
}
}
data.children = result; // 处理id为xxx 下的所有子节点
let temp = data.children
for (let res of result) {//获取子节点的子节点
arrayToTree(array, res.id, res);//递归获取子节点
}
return data;
}
const array = [
{ id: 1, pid: 0 }, // Root node
{ id: 2, pid: 1 }, // Child of node 1
{ id: 5, pid: 2 }, // Child of node 2
{ id: 3, pid: 1 }, // Child of node 1
{ id: 4, pid: 2 }, // Child of node 2
{ id: 6, pid: 3 }, // Child of node 3
{ id: 7, pid: 3 } // Child of node 3
];
console.log(JSON.stringify(arrayToTree(array)));
{
"id":1,
"pid":0,
"children":[{
"id":2,
"pid":1,
"children":[{
"id":5,
"pid":2,
"children":[]
},{
"id":4,
"pid":2,
"children":[]
}
]},{
"id":3,
"pid":1,
"children":[{
"id":6,
"pid":3,
"children":[]
},{
"id":7,
"pid":3,
"children":[]
}]
}]
}
前两天面试让我当场写算法,大致结构写出来了,但是没跑成功,今天重新写了一次。但是我很疑惑,这个算法如果是第一次写的话 我的耗时大概是两个小时左右,如果我之前写过的话我可能十几分钟就写出来了,它能作为考察面试合格的一个依据么?????????
各位面试官手下留情啊。
思路:看到这个题,无非就是递归算法。递归算法的写法就是 先找出第一项,再找出n+1 项。
- 第一种解决方案就是传入的数组先给排序,然后每次执行shift,让传入的数组长度减1,等数组长度为0时,执行完成。面试的时候就是走的这个思路,但是每一项执行完成后数据的收集出了问题。
- 第二种思路就是现在这个办法,就是每次处理都把数据收集起来,等处理结束,数据也就收集完成了。
总之:我个人认为面试时写算法完全没有必要,因为就是一个递归,也不要觉得算法很难,反正我面试时看到算法就脑子一片空白,哈哈哈哈,但是希望大家还是要尝试去写。总有好的面试官会慧眼识英雄的,虽然如果没写出来会很减分,但是要去尝试啊,要向面试官展示咱肚子有货啊。害,加油把!!!