一个很有意思又有点难的面试题,你能解出来吗?

今天遇到一个非常有意思的面试题,但是做起来感觉有点难度。我解题的办法有点笨,在此记录下这个题并且想抛砖引玉希望有大佬能看到给出一个更好的解法。
面试题如下:
假设后端同学通过接口向前端返回了天猫的行业信息,例如:

industry_list = [
  {
     "parent_ind" : "女装",
     "name" : "连衣裙"
  },
  {
     "name": "女装"
  },
  {
     "parent_ind" : "女装",
     "name" : "半身裙"
  },
  {
     "parent_ind" : "女装",
     "name" : "A字裙"
  },
  {
     "name": "数码"
  },
  {
    "parent_ind" : "数码",
     "name": "电脑配件"
  },
  {
    "parent_ind" : "电脑配件",
     "name": "内存"
  },
]

为了取用方便,我们希望可以将其转换为树状格式,例如:

{
  "数码": {
    "电脑配件": {
        "内存" : {}
     }
  },
  "女装" : {
     "连衣裙": {},
    "半身裙": {},
    "A字裙": {}
  }
}

实现一个方法完成这个转换

function convert_format(data)

咋一看感觉应该没什么难度,毕竟我处理过后端给的各种奇奇怪怪的数据格式~~~但是细想起来却发现,没那么简单 $_$
我想出来的最终的解题方法如下:

function convert_format(data){
	let dataTree = {};

	let dataArr = JSON.parse(JSON.stringify(data));
	let spliceNum = 0;
	for (let i = 0; i < data.length; i++) {
		let parent = data[i].parent_ind;
		let name = data[i].name;
		if (!parent) {
			dataTree[name] = {}
			dataArr.splice(i - spliceNum, 1);
			spliceNum++;
		}
	}
	let dataArr2 = JSON.parse(JSON.stringify(dataArr));
	spliceNum = 0;
	for (let i = 0; i < dataArr.length; i++) {
		let parent = dataArr[i].parent_ind;
		let name = dataArr[i].name;
		if (dataTree[parent]) {
			dataTree[parent][name] = {};
			dataArr2.splice(i - spliceNum, 1);
			spliceNum++;
		}
	}

	dataArr = JSON.parse(JSON.stringify(dataArr2));
	spliceNum = 0
	for (let i = 0; i < dataArr2.length; i++) {
		let parent = dataArr2[i].parent_ind;
		let name = dataArr2[i].name;
		for (let j in dataTree) {
			if (dataTree[j][parent]) {
				dataTree[j][parent][name] = {}
				dataArr.splice(i - spliceNum, 1);
				spliceNum++;
			}
		}
		
	}
	// 输出最终结果
	console.log(JSON.stringify(dataTree),JSON.stringify(dataArr));
}

我的方法看起来有点复杂,而且有个弊端是只能处理三个层级,如果“内存下”还有更多层级,那这个函数不得不通过修改来实现更多层级。
我想能不能有一个方法可以处理无限层级呢?
考虑能不能用递归处理?
但我没有想出来该怎么做,希望能有大佬帮忙解答。万分感谢~

你可能感兴趣的:(面试必读)