我有一个递归函数来遍历一个对象,并使用诸如jsonObj.object.item.value
之类的路径字符串来获取所需的内容。想法是通过某种方式对其进行升级以支持阵列。
const getValue = function(pathVar, obj) {
obj = obj || x;
// get very first node and the rest
let [node, restNodes] = pathVar.split(/\.(.+)/, 2)
// get interim object
ret = obj[node];
if(ret === undefined) return undefined;
// pass rest of the nodes further with interim object
if(restNodes) return getValue(restNodes, ret);
return ret;
};
现在,在每次迭代中,简单的正则表达式都会将jsonObj.object.item.value
之类的路径字符串拆分为jsonObj
和object.item.value
想法是在此处添加数组支持,因此我可以进行类似的转换
car.engine.something
=> car
和engine.something
wheels[2].material.name
=> wheels
和[2].material.name
[2].material.name
=> 2
和material.name
car.wheels[4]
=> car
和wheels[4]
有什么想法怎么做?
答案 0 :(得分:0)
您可以使用eval来评估表达式。对于功能性方法,请使用以下内容。
function getValue(path, obj) {
obj = obj || self; // self is the global window variable
if( !path )
return obj;
let pattern = /(?:\["?)?(\w+)(?:\.|"?])?(.*)/i;
let [ full, property, rest ] = path.match(pattern);
return getValue( rest, obj[ property ] );
}
self.obj = { foo: [ 2, {bar: "baz"} ] };
console.log(getValue('obj.foo[1]["bar"]')) // 'baz'
模式使用四个组。第一个是非捕获功能,期望可能的["
这将有助于匹配数组或对象属性。然后,我们期望捕获到一系列字母数字。然后另一个非捕获组关闭"]
或匹配.
。最后,我们捕获其余部分以供下一次调用。
eval
可以完成所有这些操作。