常见面试题 - JSON 与 TREE 互转

298 阅读2分钟

本文已参与「 新人创作礼 」活动,一起开启掘金创作之路

关于如何进行图片优化 - 适合的才是最好的

又来日更的一天了,其实也不知道写啥,但是我自己曾经的题库也是不少,有自己面试别人的,也有被别人面试总结的。

下面这道题是我在掘金看到的,也听人问过我,说是一个资深前端开发工程师肯定会的一道题。

其实通过一套题在有限的时间去测试一个人,有点牵强。

如果能够快速的写出来,当然有一定的代码经验,或者是在面试上有过准备。

无可厚非,无论怎么样选拔都是面试官筛选人才的一种方式。

这个题目其实还是比较简单,但是还是有几个知识点

1. JAVASCRIPT内置函数序列、类型判断要理解

2.函数的引用要清楚、HASH记录 ( 快速查找 ) 

其他的都是日常的工作中都会碰到的一些问题。

/* *以下数据结构中,id 代表部门编号,name 代表部门名称,parentId 是父级部门编 号,parentId为 0 代表一级部门。 * 现在要求: 1: 把树形结构转换成原始list。 2:把原始list重新还原成树形结构。 * 加分项:尽可能降低时间复杂度。 */

// 原始 树形结构 如下
let tree = [
  {
    id: 1,
    name: '部门A',
    parentId: 0,
    children: [
      {
        id: 3,
        name: '部门C',
        parentId: 1,
        children: [
          {
            id: 6,
            name: '部门F',
            parentId: 3
          }
        ]
      },
      {
        id: 4,
        name: '部门D',
        parentId: 1,
        children: [
          {
            id: 8,
            name: '部门H',
            parentId: 4
          }
        ]
      }
    ]
  },
  {
    id: 2,
    name: '部门B',
    parentId: 0,
    children: [
      {
        id: 5,
        name: '部门E',
        parentId: 2
      },
      {
        id: 7,
        name: '部门G',
        parentId: 2
      }
    ]
  }  
];

// 转换后的结构如下
 let list = [
   {id:1, name:'部门A', parentId:0},
   {id:2, name:'部门B', parentId:0},
   {id:3, name:'部门C', parentId:1},
   {id:4, name:'部门D', parentId:1},
   {id:5, name:'部门E', parentId:2},
   {id:6, name:'部门F', parentId:3},
   {id:7, name:'部门G', parentId:2},
   {id:8, name:'部门H', parentId:4}
];

function convertList(tree) {
	let list = [];
	function _fn (tree) {
		for (let i  = 0 , j = tree.length;i  <j;i++) {
			let item = tree[i]
			let {id , name,parentId , children} = item;
			list.push({
				id , name,parentId,
			});
			if (children) {
				_fn(children)
			}
		}
	}
	_fn(tree)
	return list;
}
console.log (convertList(tree))
function convertList2 (tree) {
	let list = [];
  (function (tree){
  	for (let i  = 0 , j = tree.length;i  <j;i++) {
    	let item = tree[i]
      let {id , name,parentId , children} = item;
      list.push({
				id , name,parentId
			});
      if (children) {
      	arguments.callee(children)
      }
    }
  })(tree)
  return list;
}
console.log (convertList2(tree))

function convertTree(list){
	let hash = {};
  list.forEach((item)=>{
    item.children = []
    hash[item.id] = item;
  })
  for (let i  = 0 , j = list.length;i < j;i++) {
    let item = list[i]
    let {id, parentId} = item;
    let refHash = hash[parentId];
  	if (parentId!=0 && refHash) {
    	refHash.children.push(item);
    }
  }
  let outputArr = []
  for (let i in hash) {
  	if (hash[i]["parentId"]===0) {
    	outputArr.push(hash[i])
    }
  }
  return outputArr
}
console.log (JSON.stringify(convertTree(list)[0]))

生活总是那么的无趣,在上海封闭在家,总想整点东西打发时间。工作上因为刚换不久,写代码会比较的多,也还没有去过公司。最近状态也还不错,就多输出一些东西。不过白天还是比较忙,希望可以早点去公司上班。

这个题目线上地址:tool.lu/coderunner/…