完整题目:现有 Json 数据,格式如下: json = { "a": [ { "b": "c" } , ... ] , ... }; 请实现一个方法:get(json, "a[0].b"),使其返回值为 c。要求:自己实现遍历逻辑,不允许使用正则表达式、不允许使用 eval()等类似方法
// 测试用例: json = { "a": [ { "b": "c" }, "d" ], "x": 1} get(json, "a[0].b") == "c" get(json, "a[1]") == "d" get(json, "x") == 1
对象里面访问的话基本也就是使用.访问属性或者是[]访问数组 ,所以这里关键是把数组的访问方式[]改成.的形式。这样就能获取到类似a.b.c.d.e这样的一段字符串
function get(json, str) {
str = str.split('').map(s => {
if (s === '[') return '.';
else if (s === ']') return '';
return s;
}).join(''); // 这样就能获取到a.b.c.d这样的字符串,然后再把字符串分割
return str.split('.').reduce((acc, current) => acc[current], json);
}
如果允许使用正则
function get(json, str) {
// 这里的$0是会获取到匹配到的整体,$1则是中括号中的内容
str = str.replace(/\[(\w+)\]/, ($0, $1) => `.${$1}`);
return str.split('.').reduce((acc, current) => acc[current], json);
}
网友评论