Обратиться к вложенному свойству объекта через строку
Всем доброго времени суток...
У меня вряд ли вышло сформулировать вопрос (как и для поисковиков, решился спросить) Я уже знаю что обратиться к именованным свойствам объектов в именах которых есть некоторые символы напрямую невозможно, например с дефисом: //у объекта objTest есть поле "First-Level", если попробовать обратиться к нему: objTest.First-Level = "something"; //то это вызовет ошибку, решение - запись вида objTest["First-Level"] = "something"; А как быть если существуют еще уровни вложенности, например поле "First-Level" содержит в свою очередь поле "Second-Level" как добраться до него ? // пробовал "методом тыка" ничего не вышло objTest["First-Level"["Second-Level"]]; // и т.д. (дальше просто стыдно писать что я там пробовал :) ) |
objTest["First-Level"]["Second-Level"] |
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(){
...
}
//не работает
|
objTest = { "First-Level" : { "Second-Level" : "hello!" } }
alert(objTest["First-Level"]["Second-Level"])
|
Спасибо,
а если мне понадобиться добавить еще одно поле к "First-Level" ? |
....
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]();
|
Re:
objTest[strFirst]={};
objTest[strFirst][strSecond] = function(){
alert("Second")
}
objTest[strFirst][strYes] = function(){
alert("Yes")
}
думал аналогично... но
objTest[strFirst]={};
не нравится IE8, ему мол: Предполагается наличие ')' PS: Вообще "осел" одалел уже... я пяток часов погубил, чтобы добиться от него JSON.parse(), и вот уже пару часов бьюсь как "рыба об лед" над динамическими объектами... |
Цитата:
objTest = {"First-Level": {"Second-Level": "hello"}};
objTest["First-Level"]["Second-Level-2"] = "hello-2";
alert(objTest["First-Level"]["Second-Level-2"])
|
Резюмируя сегодняшний доклад...
Значит так: динамически создавать объекты неопределенной степени вложенности - не выйдет, по крайней мере тривиально, т.к. даже если вложенность заранее известна - надо маленько потанцевать с бубном... правило "При присваивании полю значения, "за кадром" проверяется наличие такого поля, если существует - значение заменяется, если нет создается" НЕ РАБОТАЕТ когда заглядываешь далее одного уровня вложенности, интерпретаторам нужен хотя бы "колодец" ({} пустой объект) на предыдущем уровне... отсюда делаем вывод, наращивать вложенность необходимо через объявление "пустых" объектов на каждом уровне вложенности
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: А как вы добавляете к коду на форуме "Запустить" ? |
к BB тегам дописывай run, [JS] -> [JS run]
|
| Часовой пояс GMT +3, время: 17:15. |