题目来源:
Daily-Interview-Question(Github)
第 111 题:编程题,写个程序把 entry 转换成如下对象
var entry = {
a: {
b: {
c: {
dd: 'abcdd'
}
},
d: {
xx: 'adxx'
},
e: 'ae'
}
}
// 要求转换成如下对象
var output = {
'a.b.c.dd': 'abcdd',
'a.d.xx': 'adxx',
'a.e': 'ae'
}
个人解法:
var entry = {
a: {
b: {
c: {
dd: 'abcdd'
}
},
d: null,
c: undefined,
e: 'ae'
}
}
function transform(object,res={},key='',num=0){
if(object === null || object === undefined) return res;
if(res === null || res === undefined) res = {}
for(let i in object){
if(object[i] !== null && object[i] instanceof Object && Object.keys(object[i]).length > 0){
if(num!==0) transform(object[i],res,key+'.'+i,num+1)
else transform(object[i],res,i,num+1)
} else {
if(num!==0) res[key+'.'+i] = object[i];
else res[i] = object[i];
}
}
return res;
}
结果:
结果
解题过程:
1.首先想到用递归,然后用for in 循环去获取键值。
2.然后处理进行处理的对象是空的情况,处理传入的res是空或者undefined的情况。
3.考虑到键名在加“.”的时候,第一个键名前面会多一个无用的".",于是在递归函数参数中加入num用来确定层级。第一层不用进行“.”的字符串拼接
4.由于最终键名需要连着串起来,所以要把上一级拼接好的键名传到下一层(用key传递)。
5.考虑到属性值是空对象的时候,不需要接着递归,于是加入Object.keys(object[i]).length>0的判空操作。
6.除去上面的点,其余的属性直接赋值给res对象即可。
网友评论