面试了十几个高级前端,竟然连(扁平数据结构转Tree)都写不出来??

面试了十几个高级前端,竟然连(扁平数据结构转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

猜你喜欢

转载自blog.csdn.net/u011616265/article/details/118784209