2

我正在寻找一个函数,它可以根据一个键查找一个值并将该值替换为另一个值。键是 JSON 起始节点的树。这是示例。

var myData = {
    name : 'Dan',
    address: {
        city : 'Santa Clara',
                details : {
                   'prevhouse' : ''
                }
    }
}

该函数的输入是一个密钥树。例如,myData-address-details-prevhouse

当我用一个新值传递这个键时,比如'Texas',prevhouse 值将更改为我发送的新值。

新的 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

4 回答 4

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");

是一个有效的 jsfiddle 演示;查看控制台的结果

于 2012-12-21T03:33:22.817 回答
1

您应该能够遍历每个键,因为您的 JSON 只是一个 JS 对象。因此,检查每个键,检查它是否已定义,如果已定义,请使用该对象进行下一次检查。这会让你到达你想去的地方。请记住,您将把最后一个键设置为您的值。

基本伪代码,无需处理设置:

obj = data;
for (key in keys) {
  obj = obj[key]
}
于 2012-12-21T03:08:33.720 回答
1

这样的事情会做:

function update(node, path, value) {
  path = path.split('-');
  do {
    node = node[path.splice(0, 1)];
  } while(path.length > 1);
  node[path[0]] = value;
}
于 2012-12-21T03:25:56.223 回答
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);
     }
}
于 2012-12-21T03:02:57.163 回答