我正在寻找一个可以根据键查找值并将该值替换为另一个值的函数。密钥是来自JSON起始节点的树。这是一个例子。
var myData = {
name : 'Dan',
address: {
city : 'Santa Clara',
details : {
'prevhouse' : ''
}
}
}
该函数的输入是一个关键树。例如,myData-address-details-prevhouse
当我使用新值传递此键时,例如'Texas',上一个值将更改为我发送的新值。
和新的JSON将是
var myData = {
name : 'Dan',
address: {
city : 'Santa Clara',
details : {
'prevhouse' : 'Texas'
}
}
}
这是我到目前为止所写的内容
var tree = key.split("-");
现在树变量包含[“myData”,“address”,“details”,“prevhouse”]
我知道我们可以使用myData [tree [0]] [tree [1]] [tree [2]]访问该对象,但不知何故无法从解析后的值中获取动态。
我们如何动态生成它,因为直到运行时才知道深度的长度。
希望得到帮助。
答案 0 :(得分:4)
尝试使用此代码:
var myData = {
name: 'Dan',
address: {
city: 'Santa Clara',
details: {
prevhouse: ''
}
}
};
function setAttribute(obj, key, value) {
var i = 1,
attrs = key.split('-'),
max = attrs.length - 1;
for (; i < max; i++) {
attr = attrs[i];
obj = obj[attr];
}
obj[attrs[max]] = value;
console.log('myData=', myData);
}
setAttribute(myData, "myData-address-details-prevhouse", "Texas");
here一个有效的jsfiddle演示;请参阅控制台了解结果
答案 1 :(得分:1)
您应该能够遍历每个键,因为您的JSON只是一个JS对象。因此,检查每个键,检查它是否已定义,如果是,请使用该对象进行下一次检查。那会让你到达你想去的地方。请记住,您将设置最后一个键值。
基本伪代码而不处理设置:
obj = data;
for (key in keys) {
obj = obj[key]
}
答案 2 :(得分:1)
这样的事情可以做到:
function update(node, path, value) {
path = path.split('-');
do {
node = node[path.splice(0, 1)];
} while(path.length > 1);
node[path[0]] = value;
}
答案 3 :(得分:0)
鉴于myData
是对象,我认为您应该使用myData[tree[1]][tree[2]][tree[3]]
并丢弃数组中的第一项。
这样的事情应该递归地进行(未经测试)
function updateValue(obj, key, value)
{
var keys = key.split('-');
updateObjectValue(obj, keys.shift(), value);
}
function updateObjectValue(obj, keyArray, value)
{
if (keyArray.length == 1) {
obj[keyArray[0]] = value;
}
else if (keyArray.length > 1) {
updateObject(obj[keyArray[0]], keyArray.shift(), value);
}
}