0

そのようなオブジェクトがあるとします。

var t = {
    "obj1": {
        "obj1.1": "test",
        "obj1.2": {
            "obj1.1.1": null, // <-- "obj1.1.1" has to have a value.
            "obj1.1.2": "test"
        }
    }
};

そして、値を追加したいノードへのパス、すなわち:

var path = ['obj1', 'obj1.1', 'test'];

プログラムで値を追加するにはどうすればよいですか?

4

3 に答える 3

1

これを試して:

function setDeepValue(obj, value, path) {
    if(path.length > 1){
        var p=path.shift();
        if(obj[p]==null || typeof obj[p]!== 'object'){
            obj[p] = {};
        }
        setDeepValue(obj[p], value, path);
    }else{
        obj[path[0]] = value;
    }
}

var obj = {};
var path = ['obj1', 'obj1.1'];
setDeepValue(obj, 'test', path);
console.log(obj); // {"obj1":{"obj1.1":"test"}}

ただし、オブジェクトを修正する必要があります。

var t = {
    "obj1": {
        "obj1.1": "test",
        "obj1.2": {
            "obj1.1.1": null, // <-- "obj1.1.1" has to have a value.
            "obj1.1.2": "test"
        }
    }
};

オブジェクトは値のないキーを持つことができないので"obj1.1.1"、たとえそれがであっても、値を持たなければなりませんnull

于 2012-12-17T15:53:16.357 に答える
0

このオブジェクトを想定します

var obj = {
      "obj1" : {
          "obj1.1" : "",
          "obj1.2" : {
             "obj1.1.1" : "",
             "obj1.1.2" : ""
             }
          }
      }

var path = ['obj1', 'obj1.1', 'test'];

アルゴリズムは次のとおりです。

var el = obj;
for(var i = 0; i < path.length-2; i++) {
     el = el[path[i]]; 
}
el[path[i]] = path[i+1];

または関数として

function setpath(obj,path) {
    var el = obj;
    for(var i = 0; i < path.length-2; i++) {
        console.log(i+"="+path[i]);
         el = el[path[i]]; 
    }
    el[path[i]] = path[i+1];
    console.log(el);
}

setpath(obj,['obj1', 'obj1.1', 'test']);
于 2012-12-17T16:06:46.730 に答える
0
var tree = {
    "obj1": {
        "obj1.1": "test",
        "obj1.2": {
            "obj1.1.1": null,
            "obj1.1.2": "test"
        }
    }
};

var path = ['obj1', 'obj1.1', 'test'];

'test'を設定する静的な方法:

tree[path[0]][path[1]] = path[2];

'test'をnewObjに置き換える静的な方法:

var newObj = { ... };
tree[path[0]][path[1]][path[2]] = newObj;
于 2012-12-17T16:11:30.013 に答える