題目來(lái)源:
Daily-Interview-Question(Github)
第 111 題:編程題洗做,寫(xiě)個(gè)程序把 entry 轉(zhuǎn)換成如下對(duì)象
var entry = {
a: {
b: {
c: {
dd: 'abcdd'
}
},
d: {
xx: 'adxx'
},
e: 'ae'
}
}
// 要求轉(zhuǎn)換成如下對(duì)象
var output = {
'a.b.c.dd': 'abcdd',
'a.d.xx': 'adxx',
'a.e': 'ae'
}
個(gè)人解法:
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;
}
結(jié)果:
結(jié)果
解題過(guò)程:
1.首先想到用遞歸,然后用for in 循環(huán)去獲取鍵值矫夯。
2.然后處理進(jìn)行處理的對(duì)象是空的情況惊搏,處理傳入的res是空或者undefined的情況。
3.考慮到鍵名在加“.”的時(shí)候,第一個(gè)鍵名前面會(huì)多一個(gè)無(wú)用的"."娄猫,于是在遞歸函數(shù)參數(shù)中加入num用來(lái)確定層級(jí)载荔。第一層不用進(jìn)行“.”的字符串拼接
4.由于最終鍵名需要連著串起來(lái)衫生,所以要把上一級(jí)拼接好的鍵名傳到下一層(用key傳遞)。
5.考慮到屬性值是空對(duì)象的時(shí)候细办,不需要接著遞歸橙凳,于是加入Object.keys(object[i]).length>0的判空操作。
6.除去上面的點(diǎn),其余的屬性直接賦值給res對(duì)象即可笑撞。