Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обратиться к вложенному свойству объекта через строку (https://javascript.ru/forum/misc/20599-obratitsya-k-vlozhennomu-svojjstvu-obekta-cherez-stroku.html)

RUVATA 10.08.2011 21:10

Обратиться к вложенному свойству объекта через строку
 
Всем доброго времени суток...
У меня вряд ли вышло сформулировать вопрос (как и для поисковиков, решился спросить)
Я уже знаю что обратиться к именованным свойствам объектов в именах которых есть некоторые символы напрямую невозможно, например с дефисом:
//у объекта objTest есть поле "First-Level", если попробовать обратиться к нему:
objTest.First-Level = "something";
//то это вызовет ошибку, решение - запись вида
objTest["First-Level"] = "something";

А как быть если существуют еще уровни вложенности, например поле "First-Level" содержит в свою очередь поле "Second-Level"
как добраться до него ?
// пробовал "методом тыка" ничего не вышло
objTest["First-Level"["Second-Level"]];
// и т.д. (дальше просто стыдно писать что я там пробовал :) )

Octane 10.08.2011 21:12

objTest["First-Level"]["Second-Level"]

RUVATA 10.08.2011 21:17

objTest["First-Level"]["Second-Level"]

нет, такая конструкция тоже не подходит...
не съели ни интерпретатор node.js, ни IE8
дебаггер последнего обругался так "Предполагается наличие объекта"
PS:
при этом просто
objTest["First-Level"]

проблем не вызывает

PSS: наверное будет проще мне помочь если я еще кое что разъясню;
Мне необходимо создавать объекты неопределенной степени вложенности, при этом
имена полей заранее не известны в конечном итоге я получаю их из переменных.
До определенного момента меня устраивали строки в формате JSON ну и собственно JSON.parse,
но в последствии появилась необходимость передавать некоторую логику, которую через JSON "ни-ни"
можно конечно через eval... но это мол неправильно и небезопасно...
вот например задачка
var strFirst = "First-Level"
var strSecond = "Second-level"
var objTest;
//как мне создать такое поле и передать ему например некую функцию ?
objTest[strFirst][strSecond] = function(){
...
}
//не работает

melky 10.08.2011 21:27

objTest = { "First-Level" : { "Second-Level" : "hello!" } }

alert(objTest["First-Level"]["Second-Level"])

RUVATA 10.08.2011 21:38

Спасибо,
а если мне понадобиться добавить еще одно поле к "First-Level" ?

рони 10.08.2011 22:05

....
var strFirst = "First-Level"
var strSecond = "Second-level"
var strYes = "Yes-level"
var objTest={};
objTest[strFirst]={};
objTest[strFirst][strSecond] = function(){
alert("Second")
}
objTest[strFirst][strYes] = function(){
alert("Yes")
}
objTest[strFirst][strSecond]();
objTest[strFirst][strYes]();

RUVATA 10.08.2011 22:20

Re:
objTest[strFirst]={};
objTest[strFirst][strSecond] = function(){
alert("Second")
}
objTest[strFirst][strYes] = function(){
alert("Yes")
}

думал аналогично...
но
objTest[strFirst]={};

не нравится IE8, ему мол: Предполагается наличие ')'
PS: Вообще "осел" одалел уже... я пяток часов погубил, чтобы добиться от него JSON.parse(), и вот уже пару часов бьюсь как "рыба об лед" над динамическими объектами...

Magneto 10.08.2011 22:21

Цитата:

Сообщение от RUVATA (Сообщение 119608)
а если мне понадобиться добавить еще одно поле к "First-Level" ?


objTest = {"First-Level": {"Second-Level": "hello"}};

objTest["First-Level"]["Second-Level-2"] = "hello-2";

alert(objTest["First-Level"]["Second-Level-2"])

RUVATA 10.08.2011 22:41

Резюмируя сегодняшний доклад...
Значит так: динамически создавать объекты неопределенной степени вложенности - не выйдет, по крайней мере тривиально, т.к. даже если вложенность заранее известна - надо маленько потанцевать с бубном... правило "При присваивании полю значения, "за кадром" проверяется наличие такого поля, если существует - значение заменяется, если нет создается" НЕ РАБОТАЕТ когда заглядываешь далее одного уровня вложенности, интерпретаторам нужен хотя бы "колодец" ({} пустой объект) на предыдущем уровне...
отсюда делаем вывод, наращивать вложенность необходимо через объявление "пустых" объектов на каждом уровне вложенности
var strFirst = "First-Level"
var strSecond = "Second-level"
var strThird = "Third-level"
var strFour = "Four-level"
var objTest={};
objTest[strFirst]={};
objTest[strFirst][strSecond] = {};
objTest[strFirst][strSecond][strThird]={};
objTest[strFirst][strSecond][strThird][strFour]='hello';
alert(objTest[strFirst][strSecond][strThird][strFour]);


PS: А как вы добавляете к коду на форуме "Запустить" ?

Magneto 10.08.2011 22:55

к BB тегам дописывай run, [JS] -> [JS run]


Часовой пояс GMT +3, время: 12:43.