最近这面试题不得不说,简直是有点非人类的感觉,在正常的业务逻辑中不应该出现这样的数据处理逻辑,如果有,我要跟后端打一架!!
不过既然是面试,那只能见招拆招,兵来将挡水来土掩。
废话不多说,看题
const pathList = ["/a/b", "/a/2/c", "/d"];
/**
* 如上,输入是一个一维String数组pathList,里面记录了由"/"分隔的字符串,
* 表示了用户在系统中存储的目录结构
* 现在需要将这个目录结构进行结构化,方便使用Echarts等可视化组件进行绘制
* 结构化的要求:将目录结构以嵌套对象的形式表现出来,如最后23~31行的注释
*
* 实现要求:请实现下面的pathFormat方法,完成这个结构化的过程
{
"a": {
"2": {
"c": {}
},
"b": {}
},
"d": {}
}
*/
解:
// 写的着急,方法不太好,发出来也是为了记录学习,请各位大佬多多指点
function pathFormat(pathList) {
const answer = {}; // todo: 将pathList转化成目标结构,更新到answer中
// 递归将字符串转换声深层对象
const fn = (key, obj) => {
let objCopy = {}
let num = obj && Object.keys(obj)
if (!!num) {
if (num.length == 0) {
obj[key] = {}
} else {
obj[num[0]] = fn(key, obj[num[0]])
}
}
objCopy = JSON.parse(JSON.stringify(obj))
return objCopy
}
// 递归将多个深层对象进行key值匹配,去掉重复的,留下不同的
const deepObjectMerge = (original, mergeOBJ) => { // 深度合并对象
for (var key in mergeOBJ) {
original[key] = original[key] && original[key].toString() === "[object Object]" ?
deepObjectMerge(original[key], mergeOBJ[key]) : original[key] = mergeOBJ[key];
}
return original;
}
// 循环每一项递归处理
pathList.forEach(element => { // 循环截取掉/
let a = {}
for (const key in element) {
if (element[key] !== '/') {
a = fn(element[key], a)
}
}
deepObjectMerge(answer, a)
});
return answer;
}
console.log(JSON.stringify(pathFormat(pathList), null, 2));