Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.08.2011, 21:10
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 41

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

А как быть если существуют еще уровни вложенности, например поле "First-Level" содержит в свою очередь поле "Second-Level"
как добраться до него ?
// пробовал "методом тыка" ничего не вышло
objTest["First-Level"["Second-Level"]];
// и т.д. (дальше просто стыдно писать что я там пробовал :) )
Ответить с цитированием
  #2 (permalink)  
Старый 10.08.2011, 21:12
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

objTest["First-Level"]["Second-Level"]
Ответить с цитированием
  #3 (permalink)  
Старый 10.08.2011, 21:17
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 41

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(){
...
}
//не работает

Последний раз редактировалось RUVATA, 10.08.2011 в 21:30.
Ответить с цитированием
  #4 (permalink)  
Старый 10.08.2011, 21:27
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

alert(objTest["First-Level"]["Second-Level"])
Ответить с цитированием
  #5 (permalink)  
Старый 10.08.2011, 21:38
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 41

Спасибо,
а если мне понадобиться добавить еще одно поле к "First-Level" ?
Ответить с цитированием
  #6 (permalink)  
Старый 10.08.2011, 22:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

....
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]();
Ответить с цитированием
  #7 (permalink)  
Старый 10.08.2011, 22:20
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 41

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

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

не нравится IE8, ему мол: Предполагается наличие ')'
PS: Вообще "осел" одалел уже... я пяток часов погубил, чтобы добиться от него JSON.parse(), и вот уже пару часов бьюсь как "рыба об лед" над динамическими объектами...
Ответить с цитированием
  #8 (permalink)  
Старый 10.08.2011, 22:21
Аватар для Magneto
Люмус, Емаксос Developer!
Отправить личное сообщение для Magneto Посмотреть профиль Найти все сообщения от Magneto
 
Регистрация: 06.05.2010
Сообщений: 677

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

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

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

alert(objTest["First-Level"]["Second-Level-2"])
Ответить с цитированием
  #9 (permalink)  
Старый 10.08.2011, 22:41
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 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: А как вы добавляете к коду на форуме "Запустить" ?

Последний раз редактировалось RUVATA, 10.08.2011 в 22:44.
Ответить с цитированием
  #10 (permalink)  
Старый 10.08.2011, 22:55
Аватар для Magneto
Люмус, Емаксос Developer!
Отправить личное сообщение для Magneto Посмотреть профиль Найти все сообщения от Magneto
 
Регистрация: 06.05.2010
Сообщений: 677

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача полю объекта - массиву, значения элемента через set метод poorking Общие вопросы Javascript 1 13.02.2011 20:22
Обратиться к полю объекта по ID элемента pavlyku Общие вопросы Javascript 3 18.08.2010 01:37
Как в JavaScript присвоить функцию свойству объекта? kokon Общие вопросы Javascript 5 25.05.2010 22:11
Сохранение объекта в строку micscr Общие вопросы Javascript 5 01.05.2010 13:29
как обратиться к childNode по его id в div-е, через id родителя kichSman Events/DOM/Window 5 28.10.2009 02:16