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