Установка значения вложенного объекта [дубликат]
На этот вопрос уже есть ответ здесь:
Javascript: как динамически создавать вложенные объекты, используя имена объектов, заданные массивом
17 ответов
У меня есть следующий объект:
var object = {
"property1": "value1",
"property2": "value2",
"subobject": {
"property1": "value1",
"property2": "value2",
"subobject": {
"property1": "value1",
"property2": "value2",
"subobject": {...
}
}
}
}
Я пытаюсь установить одно из вложенных свойств подобъекта,но вложенный уровень является динамическим.
Как я могу динамически установить один из них вложенные свойства, не делая что-то вроде этого: object.subobject.subobject = { ... }?
Редактировать:
Поэтому, чтобы быть более точным, я пытаюсь установить один из вложенных подобъектов, но я не буду знать, какой из них каждый раз.
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