在JSON中查找给定键的值,并使用javascript更改该值

时间:2012-12-21 02:56:48

标签: javascript json

我正在寻找一个可以根据键查找值并将该值替换为另一个值的函数。密钥是来自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]]访问该对象,但不知何故无法从解析后的值中获取动态。

我们如何动态生成它,因为直到运行时才知道深度的长度。

希望得到帮助。

4 个答案:

答案 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);
     }
}