在Javascript中评估路径式表达式的简便方法?

时间:2010-02-19 14:48:12

标签: javascript

如果我有一个JavaScript对象,例如:

var x = {foo: 42, bar: {fubar: true}}

然后我可以使用true获取值var flag = x.bar.fubar。我希望能够分离并存储路径"bar.fubar",然后动态评估它。类似的东西:

var paths = ["bar.fubar", ...];
...
var flag = evalPath( x, paths[0] );

显然,我可以为基本路径表达式语法编写一个简单的解析器和求值器。但是根据DRY原则,我想知道是否已经有一种现有的方法可以做一些内置于JavaScript的evalPath或者一个可以完成这项工作的小型库?我还预计将来在路径表达式中需要数组索引。

更新为了清楚起见,我不是要求代码示例 - 我的问题是我是否可以重复使用现有代码(内置或库)。感谢下面的贡献者提供代码示例的建议!请注意,它们都不处理数组索引要求。

6 个答案:

答案 0 :(得分:1)

为什么不尝试类似

的内容
function evalPath(obj, path)
{
    var rtnValue = obj;

    // Split our path into an array we can iterate over
    var path = path.split(".");
    for (var i = 0, max=path.length; i < max; i++) 
    {
        // If setting current path to return value fails, set to null and break
        if (typeof (rtnValue = rtnValue[path[i]]) == "undefined")
        {
            rtnValue = null;
            break;
        }
    }

    // Return the final path value, or null if it failed
    return rtnValue;
}

未经测试,但应该可以正常使用。与XPath一样,如果无法找到它正在寻找的内容,它将返回null。

答案 1 :(得分:1)

快速搜索,我遇到JSONPath。完全没有使用它,但看起来它可能会按你想要的那样。

使用示例:

var x = {foo: 42, bar: {fubar: true}}
var res1 = jsonPath(x, "$.bar.fubar"); // Array containing fubar's value

答案 2 :(得分:0)

JavaScript提供eval,但我不推荐它。

答案 3 :(得分:0)

你可以尝试这样的事情。我真的不能想到以这种方式存储路径是合适的情况。

function evalPath(obj, path) {
  var pathLevels = path.split('.');
  var result = obj;
  for (var i = 0; i < pathLevels.length; i++) {
    try {
      result = result[pathLevels[i]];
    }
    catch (e) {
      alert('Property not found:' + pathLevels[i]);
    }
  }
  return result;
}

alert实际上仅用于调试目的。您可能想要返回null或其他内容。

答案 4 :(得分:0)

喜欢

function locate(obj, path) {
    var p = path.split("."), a = p.shift();
    if(a in obj)
       return p.length ? locate(obj[a], p.join(".")) : obj[a];
     return undefined;
}

locate(x, "bar.fubar")

这只适用于右边,当然

答案 5 :(得分:0)

怎么样:

evalPath = function(obj, path) {
  if (path[0] === "[") {
    return eval("obj" + path);
  } else {
    return eval("obj." + path);
  }
};

这样做的好处是它适用于任意字符串:

evalPath([1,2,3],“[0]”); =&GT; 1

evalPath({a:{b:7}},“a.b”); =&GT; 7

当然,这只有在您真正信任您的意见时才有效。