美文网首页
第111题 编程题

第111题 编程题

作者: CRJ997 | 来源:发表于2019-07-23 13:22 被阅读0次

    题目来源:
    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对象即可。

    相关文章

      网友评论

          本文标题:第111题 编程题

          本文链接:https://www.haomeiwen.com/subject/nsuolctx.html