代码之家  ›  专栏  ›  技术社区  ›  Ian Dickinson

在javascript中评估类似路径的表达式的简单方法?

  •  0
  • Ian Dickinson  · 技术社区  · 16 年前

    如果我有一个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] );
    

    显然,我可以为基本的路径表达式语法编写一个简单的解析器和计算器。但在干巴巴的原则下,我想知道是否已经有一种现有的方法来做类似的事情 evalPath 内置到javascript,还是一个小的库来完成这项工作?我还预计将来在路径表达式中需要数组索引。

    更新 只是说清楚,我不是在要求代码样本——我的问题是是否有现有的代码(内置的或库)可以重用。感谢下面的贡献者对代码示例的建议!请注意,它们都不处理数组索引要求。

    6 回复  |  直到 16 年前
        1
  •  1
  •   cmptrgeekken    16 年前

    JSONPath

    var x = {foo: 42, bar: {fubar: true}}
    var res1 = jsonPath(x, "$.bar.fubar"); // Array containing fubar's value
    
        2
  •  1
  •   Andy E    16 年前

    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;
    }
    

        3
  •  0
  •   Hank Gay    16 年前

    eval

        4
  •  0
  •   user187291    16 年前

    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
  •   ntownsend    16 年前

    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

        6
  •  0
  •   Jason Walton    12 年前

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