4

次のオブジェクトがあります。

var object = {
    "property1": "value1",
    "property2": "value2",
    "subobject": {
        "property1": "value1",
        "property2": "value2",
        "subobject": {
            "property1": "value1",
            "property2": "value2",
            "subobject": {...
            }
        }
    }
}

ネストされたサブオブジェクト プロパティの 1 つを設定しようとしていますが、ネストされたレベルは動的です。

次のようなことをせずに、これらのネストされたプロパティの 1 つを動的に設定するにはどうすればよいobject.subobject.subobject = { ... }ですか?

編集: より具体的には、ネストされたサブオブジェクトの1つを設定しようとしていますが、毎回どれかわかりません。

4

4 に答える 4

5

再帰を使おう!

function setNest(obj, level, val){
    if(level > 0){
        setNest(obj.subobject, level-1, val);
    }
    else{
        obj.subobject = val;
    }
}

次に、次のように呼び出します。

setNest(object, 2, {a: 12});
于 2012-06-15T16:47:41.993 に答える
0

次のように、Immutable.jsを使用してみてください。

var immutableJsObject = Immutable.fromJS({
  inputs: {
    firstDepthNumberOne: {
      secondDepth: 'secondDepthValue'
    },
    firstDepthNumberTwo: 'hello'
  }
});

var newImmutableJsObject = immutableJsObject.setIn('inputs.firstDepthNumberOne.secondDepth'.split('.'), 'newValue');

newImmutableJsObject.toJS();
于 2016-04-04T00:34:39.980 に答える
0

独自の Object メソッドを定義できます。また、簡潔にするためにアンダースコアを使用しています。

var _ = require('underscore');

// a fast get method for object, by specifying an address with depth
Object.prototype.pick = function(addr) {
    if (!_.isArray(addr)) return this[addr]; // if isn't array, just get normally
    var tmpo = this;
    while (i = addr.shift())
        tmpo = tmpo[i];
    return tmpo;
};
// a fast set method for object, put value at obj[addr]
Object.prototype.put = function(addr, val) {
    if (!_.isArray(addr)) this[addr] = val; // if isn't array, just set normally
    this.pick(_.initial(addr))[_.last(addr)] = val;
};

使用例:

var obj = { 
           'foo': {
                   'bar': 0 }}

obj.pick('foo'); // returns { bar: 0 }
obj.pick(['foo','bar']); // returns 0
obj.pick('foo.bar'.split('.')); // equivalent as above, returns 0
obj.put(['foo', 'bar'], -1) // obj becomes {'foo': {'bar': -1}}
于 2015-05-27T15:14:31.587 に答える