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

原文地址:https://www.cnblogs.com/xiaokeai0110/p/9688242.html