【问题标题】:Get json value from string containing key path [duplicate]从包含键路径的字符串中获取json值[重复]
【发布时间】:2015-02-23 20:06:25
【问题描述】:

我有一个输入数组,路径类似于

var path = ["foo","bar","baz"];

我有一个对象

var obj = {
    "foo": {
         "bar": {
              "baz": "cake"
         },
         "notbar": {
              "another": "value"
         }
    }
}

我想更改路径中的“baz”值。 我知道我可以使用

obj[path[0]][path[1]][path[2]] = "value";

但我不知道数组会有多长时间。 php 和 javascript anwsers 都值得赞赏!

【问题讨论】:

标签: javascript php object


【解决方案1】:

试试这个:

function getValueByPath(obj, path) {
    var result = obj,
        i;
    for (i = 0; i < path.length; i++) {
        try {
            result = result[path[i]];
        }
        catch (e) {
            return undefined;
        }
    }
    return result
}

function setValueByPath(obj, path, value) {
    var result = obj,
        i;
    for (i = 0; i < path.length - 1; i++) {
        try {
            result = result[path[i]];
        }
        catch (e) {
            return;
        }
    }

    if (typeof value == 'object') {
        result[path[i]] = value;
    }
}

给定变量初始化,getValueByPath(obj, path) 返回'cake',然后将其设置为setValueByPath(obj, path, 'value');现在getValueByPath(obj, path) 返回'value'

【讨论】:

    【解决方案2】:

    这样的东西应该可以工作

    function modify(obj, path, val) {
        var e = obj, l = path.pop();
    
        path.forEach(function(x) { x in e ? e = e[x] : e; });
    
        if (typeof val === 'undefined') return e[l];
        e[l] = val;
        return e;
    }
    

    你可以称它为 getter 或 setter

    var what = modify(obj, path);  // returns "cake"
    
    modify(obj, path, 'new value');
    
    var what2 = modify(obj, path);  // now return "new value", object was modified
    

    FIDDLE

    【讨论】:

      【解决方案3】:

      这是我的不漂亮但可行的解决方案:

      function setPropertyByPath(obj, path, value) {
          if(!path || path.length === 0) return;
      
          var property = path[0];
          for(var i = 1; i < path.length; i++) {
            property += "." + path[i];
          }
          property = "obj." + property + " = \"" + value + "\"";
          eval(property)
      }
      

      然后你打电话

      setPropertyByPath(obj, path, "newValue");
      

      这是一个有效的FIDDLE

      【讨论】:

      • 使用 eval 来转换字符串“.”其实很聪明。对象值!
      猜你喜欢
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2019-05-12
      • 2013-09-23
      • 1970-01-01
      • 2016-01-18
      相关资源
      最近更新 更多