zoukankan      html  css  js  c++  java
  • 【练习】实现一个parse方法(需要实现的效果见内容),方法总结

    【本题来自牛客网,解题方法也借鉴于牛客网上讨论区中的多种答案,在此做一个总结】

    parse方法需要实现的效果如下:

    var object = {
     b: { c: 4 }, d: [{ e: 5 }, { e: 6 }]
    };
    console.log( parse(object, ‘b.c’) == 4 ) //true
    console.log( parse(object, ‘d[0].e’) == 5 ) //true
    console.log( parse(object, ‘d.0.e’) == 5 ) //true
    console.log( parse(object, ‘d[1].e’) == 6 ) //true
    console.log( parse(object, ‘d.1.e’) == 6 ) //true
    console.log( parse(object, ‘f’) == ‘undefined’ ) //true

    先来理解一下这个方法需要实现什么功能,简单来说就是传入两个参数,第一个参数为待访问的一个对象,第二个参数为一个字符串,字符串中是调用对象中的值的语句,parse()方法需要根据字符串中的语句访问object对象,并返回访问的结果。

    那么,怎么实现这个方法呢。

    可以看到题中传入的字符串中的语句,有点表示法和方括号表示法,将字符串中的字母分割出来放进数组,再迭代访问object对象。

    解决方案1:

    在访问对象之前,先将"["转换成"."并将"]"转换成""。

    接着用split分割字符串。

    用map函数迭代分割后的数组,呈现obj[b[c]]的形式访问object。

    function parse(obj, str) {
        str.replace('[', '.').replace(']', '').split('.').map((ele) => obj = obj[ele.trim()]);
    
        return obj || 'undefined';
    }

    解决方案2:

    function parse(obj, str) {
        var arr = str.replace('[', '.').replace(']', '').split('.');
        //循环方法迭代访问
        for(var i=0;i<arr.length;i++) {
          if (obj[arr[i]]) {
            obj = obj[arr[i]];
          }else {
            return 'undefined';
          }
        }
      return obj;
    }

    解决方案3:

    function parse(obj, str) {
        //使用reduce迭代
        var o = str.replace('[', '.').replace(']', '').split('.').reduce((pre,cur) => cur ? pre[cur] : pre,obj);
        return o || 'undefined';
    }

    解决方案4:

    //不替换掉中括号,直接判断分割字符串
    function parse(obj, str) {
        var o = str.split(/\.|\[|\]/).reduce((pre,cur) => cur ? pre[cur] : pre,obj);
        return o || 'undefined';
    }

    解决方案5:

    这可能是最简洁的方法了...但是好像有点违背了题目的本意?:)

    //使用eval()直接执行访问语句
    function parse(obj, str) {
        obj = eval('obj.'+str);
        return obj || 'undefined';
    }

    end

  • 相关阅读:
    An AODV Tutorial
    MFC去掉单文档的"无标题-"的方法
    win32 openss 编译
    ASP.NET实现RENREN SIG计算
    std::string str.c_str() const
    fopen
    curl with ssl support for win32
    VC++ utf8 Unicode GB2312 编码转换
    编码转换
    VirtualBox uuid冲突问题
  • 原文地址:https://www.cnblogs.com/xiaokeai0110/p/9688242.html
Copyright © 2011-2022 走看看