正则表达式:具有数组支持的拆分对象表示法路径字符串

时间:2019-05-29 14:35:09

标签: javascript regex javascript-objects

我有一个递归函数来遍历一个对象,并使用诸如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之类的路径字符串拆分为jsonObjobject.item.value

想法是在此处添加数组支持,因此我可以进行类似的转换

car.engine.something => carengine.something
wheels[2].material.name => wheels[2].material.name
[2].material.name => 2material.name
car.wheels[4] => carwheels[4]

有什么想法怎么做?

1 个答案:

答案 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可以完成所有这些操作。