• 【练习】实现一个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

  • 相关阅读:
    如何使用Orchard搭建敏捷个人的网站(1)
    英语:敏捷英语学习开始了
    英语:普特三步听写法(转载)
    色拉英语第一集第五幕:好胖的一只鸟
    介绍一个基于ASP.NET MVC的框架Catharsis
    色拉英语第2集第3幕:He’s my favorite
    Orchard:如何生成Hello World模块
    如何使用Orchard搭建敏捷个人的网站(2)
    色拉英语第一集第四幕:我不喜欢北京烤鸭
    色拉英语第一集第二幕:请问南京路怎么走?
  • 原文地址:https://www.cnblogs.com/xiaokeai0110/p/9688242.html
Copyright © 2020-2023  润新知