第111题 编程题

题目来源:
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;
 }

结果:


第111题 编程题_第1张图片
结果

解题过程:
1.首先想到用递归,然后用for in 循环去获取键值。
2.然后处理进行处理的对象是空的情况,处理传入的res是空或者undefined的情况。
3.考虑到键名在加“.”的时候,第一个键名前面会多一个无用的".",于是在递归函数参数中加入num用来确定层级。第一层不用进行“.”的字符串拼接
4.由于最终键名需要连着串起来,所以要把上一级拼接好的键名传到下一层(用key传递)。
5.考虑到属性值是空对象的时候,不需要接着递归,于是加入Object.keys(object[i]).length>0的判空操作。
6.除去上面的点,其余的属性直接赋值给res对象即可。

你可能感兴趣的:(第111题 编程题)