我有一个输入数组,路径类似
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