从包含密钥路径的字符串中获取json值


Get json value from string containing key path

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

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 anwser都很感激!

试试这个:

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');现在CCD_ 5返回CCD_。

这样的东西应该能在中工作

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

这是我的不漂亮但有效的解决方案:

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