面试了十几个高级前端,竟然连(扁平数据结构转Tree)都写不出来???
在网上看到一个好玩的面试题。自己试着玩了一下。
我们看下题目:打平的数据内容如下:
let arr = [
{
id: 1, name: '部门1', pid: 0},
{
id: 2, name: '部门2', pid: 1},
{
id: 3, name: '部门3', pid: 1},
{
id: 4, name: '部门4', pid: 3},
{
id: 5, name: '部门5', pid: 4},
]
输出结果
[
{
"id": 1,
"name": "部门1",
"pid": 0,
"children": [
{
"id": 2,
"name": "部门2",
"pid": 1,
"children": []
},
{
"id": 3,
"name": "部门3",
"pid": 1,
"children": [
// 结果 ,,,
]
}
]
}
]
我们的要求很简单,可以先不用考虑性能问题。实现功能即可。
博主说这个是面试高级前端开发工程师的一道笔试题。且十几个人只有一两个同学做出来的。感觉有一点吃惊。
接下来我贴一下我的代码:
let newArr = [];
for (let i = 0; i < arr.length; i++) {
let thid = arr[i].id;
let children = [];
for (let k = i; k < arr.length; k++) {
if (arr[k].pid == thid) {
//如果当前的元素的pid等于上一层的id那么就拼合数组
children.push(arr[k]);
// arr[i].children.push(arr[k]);
}
if (arr.length - k == 1 && children.length > 0) {
let larr = arr[i];
larr.children = children;
newArr.push(larr);
// arr[i].children=children;
} else if (arr.length - k == 1 && children.length == 0) {
newArr.push(arr[i]);
}
}
}
console.log(newArr);
我的思路比较简单,拿到数据后先不考虑数组第一个元素,排头元素无法向上比较,所以直接从数组第二个元素开始比较;当pid等于上一个元素的id时则是上一个元素的子元素,可以开始组装新的数组。
这个过程中会遇到一个问题就是浅拷贝的问题。
那这样的话就不是上面题目所要的输出结果了。浅拷贝与深拷贝可以自行百度。
接下来就是处理这个BUG了:
let newArr = [];
for (let i = 0; i < arr.length; i++) {
let thid = arr[i].id;
let children = [];
for (let k = i; k < arr.length; k++) {
if (arr[k].pid == thid) {
//如果当前的元素的pid等于上一层的id那么就拼合数组
children.push(arr[k]);
// arr[i].children.push(arr[k]);
}
if (arr.length - k == 1 && children.length > 0) {
let larr = Object.assign({
}, arr[i]);
larr.children = children;
newArr.push(larr);
// arr[i].children=children;
} else if (arr.length - k == 1 && children.length == 0) {
newArr.push(Object.assign({
}, arr[i]));
}
}
}
console.log(newArr);
原文大佬比我说的更加详细,有兴趣可以自行查看
[1]: https://juejin.cn/post/6983904373508145189