Установка значения вложенного объекта [дубликат]



На этот вопрос уже есть ответ здесь:



У меня есть следующий объект:



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


Я пытаюсь установить одно из вложенных свойств подобъекта,но вложенный уровень является динамическим.



Как я могу динамически установить один из них вложенные свойства, не делая что-то вроде этого: object.subobject.subobject = { ... }?



Редактировать:
Поэтому, чтобы быть более точным, я пытаюсь установить один из вложенных подобъектов, но я не буду знать, какой из них каждый раз.

393   4  

4 ответов:

Давайте использовать рекурсию!

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

Тогда назовем его так:

setNest(object, 2, {a: 12});

Использование рекурсии-рефактора (спасибо Rocket Hazmat)

Эта функция работает для меня!:

/**
 * @obj: the json object to change
 * @access: string dot separates route to value
 * @value: new valu
 */
function setValue(obj,access,value){
    if (typeof(access)=='string'){
        access = access.split('.');
    }
    if (access.length > 1){
        setValue(obj[access.shift()],access,value);
    }else{
        obj[access[0]] = value;
    }
}

Имея объект:

var jsonObject = {
    'name' : 'pepe',
    'links' : 
        {
        'link1' : 'one',
        'link2' : 'two',
        'link3' : 
            {
            'link31' : '3url',
            'link32' : '3url',
            'link33' : '3url'
            }
        }
 }

Мы можем легко изменить значение с помощью:

 setValue(jsonObject,'links.link3.link32','new value!!!');

Спасибо

Вы можете определить свои собственные методы объектов; также я использую подчеркивание для краткости:

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}}

Можно попробовать использовать Immutable.js , примерно так:

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

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

newImmutableJsObject.toJS();

Comments

    Ничего не найдено.