Обратиться к вложенному свойству объекта через строку
Всем доброго времени суток...
У меня вряд ли вышло сформулировать вопрос (как и для поисковиков, решился спросить) Я уже знаю что обратиться к именованным свойствам объектов в именах которых есть некоторые символы напрямую невозможно, например с дефисом: //у объекта 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, время: 12:43. |