Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.02.2010, 02:37
Аватар для Скриптор
Аспирант
Отправить личное сообщение для Скриптор Посмотреть профиль Найти все сообщения от Скриптор
 
Регистрация: 05.02.2010
Сообщений: 35

Динамическое имя вызываемого массива
Скажите, уважаемые эксперты, а как можно в JS массив по изменяемому имени. Есть ли что-то подобное тому, что есть для регулярных выражений?
var reg = new RegExp("ИскомыйТЕКСТ", "ФЛАГИ")


То есть как я себе представляю эту функцию:
Аrray("ИмяМассива", "ИНДЕКС")


Например:
var MBD = []
var array_name = MBD    // ситуативное
Аrray(array_name, "5")  // вместо "MBD[5]" в данном случае. То есть в данном месте кода может оказаться абсолютно любой по имени (из уже ранее объявленных) массив.

Последний раз редактировалось Скриптор, 13.02.2010 в 02:50.
Ответить с цитированием
  #2 (permalink)  
Старый 13.02.2010, 11:50
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Лучший вариант — хранить данные (массивы) в объекте:
var data = {
    abc: […],
    bcd: […],
    cde: […]
};

тогда обращение к свойству объекта (массиву) будет осуществлятся следующим образом:
data["abc"]



К глобальным массивам можно обратится так:
var abc = […], bcd = […], cde = […];

window["abc"]



Для локальных областей можно использовать eval, но лучше так не делать:
eval("var array = abc;");


Вообще это основы JavaScript, читайте теорию.
Ответить с цитированием
  #3 (permalink)  
Старый 13.02.2010, 15:17
Аватар для Скриптор
Аспирант
Отправить личное сообщение для Скриптор Посмотреть профиль Найти все сообщения от Скриптор
 
Регистрация: 05.02.2010
Сообщений: 35

Первый случай очевидный - именно так и делаю.
Третий (использование eval) - так и не понял.
А вариант с window - то, что доктор прописал. Спасибо, Octane.
Ответить с цитированием
  #4 (permalink)  
Старый 13.02.2010, 15:36
Аватар для Скриптор
Аспирант
Отправить личное сообщение для Скриптор Посмотреть профиль Найти все сообщения от Скриптор
 
Регистрация: 05.02.2010
Сообщений: 35

Цитата:
К глобальным массивам можно обратится так:
var abc = [7,8,22], bcd = [8], cde = [9]; 

window["abc"]

Только почему здесь вместо конкретного имени ("abc") не может быть вычисляемой переменной? В Tcl было все так удобно и лаконично...



Хотелось бы чего-то наподобие:
Код:
var abc = [7,8,22], bcd = [8], cde = [mbp, abc, bcd];
window[cde[1]][2]   // ==> 22
Примечание: в данном случае я храню имена массивов тоже в массиве, специально отведенном для этого; через него и обращаюсь к ним. Награмождение скобок - для TCL'я вообще не редкость, но, главное, что это работает.


Не могу понять почему подобное не работает, хотя бы в виде:
Код:
window[eval(cde[1])][2]
или
window[eval('cde[1]')][2]


Эту задачу я, в принципе, мог бы решить и на одних регулярных выражениях, но мне сейчас интересно как это могло бы выглядеть в JS на массивах.

Последний раз редактировалось Скриптор, 13.02.2010 в 16:28.
Ответить с цитированием
  #5 (permalink)  
Старый 13.02.2010, 17:46
Аватар для Скриптор
Аспирант
Отправить личное сообщение для Скриптор Посмотреть профиль Найти все сообщения от Скриптор
 
Регистрация: 05.02.2010
Сообщений: 35

Цитата:
Хотелось бы чего-то наподобие:
Код:
var abc = [7,8,22], bcd = [8], cde = [mbp, abc, bcd];
window[cde[1]][2]   // ==> 22
window[eval(cde[1])][2]
или
window[eval('cde[1]')][2]
Блин!.. Главный, секрет был в "скобочках", вернее кавычечках!


Следовало так (может кому и пригодится):
Код:
var abc = [7,8,22], bcd = [8], cde = ["mbp", "abc", "bcd"];
window[cde[1]][2]           // ==> 22
window[eval('cde[1]')][2]   // ==> 22
window[eval(cde[1])][2]     // Неправильно: без кавычек работать не хочет!
Как говорится: "Найдите 10 отличий!" ( В следующий раз я ради перестраховки буду кавычить даже числа! )


Самое странное, что как-то в примерах мануалов подобных удобных примеров не было! Может быть для кого-то это очевидно, но скорее для самого автора мануала

Было б здорово, если б у кого-то дошли руки описать подобные трюки.
Ответить с цитированием
  #6 (permalink)  
Старый 13.02.2010, 18:18
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от Скриптор
Самое странное, что как-то в примерах мануалов подобных удобных примеров не было! Может быть для кого-то это очевидно, но скорее для самого автора мануала

Было б здорово, если б у кого-то дошли руки описать подобные трюки.
А что тут неочевидного? Что может быть подставлено вместо имени свойства, если не строка?

У вас проблемы с архитектурой приложения, раз так приходится обращаться к массивам.
Ответить с цитированием
  #7 (permalink)  
Старый 13.02.2010, 21:26
Аватар для Скриптор
Аспирант
Отправить личное сообщение для Скриптор Посмотреть профиль Найти все сообщения от Скриптор
 
Регистрация: 05.02.2010
Сообщений: 35

Сообщение от Octane Посмотреть сообщение
У вас проблемы с архитектурой приложения, раз так приходится обращаться к массивам.
Ну, Octane, раз уж Ваш уровень позволяет ставить диагноз заочно - посоветуйте рабочую альтернативу!

Я достаточно слеп, чтобы делать только то и так, как это я сейчас делаю.
Но буду благодарен, всякому кто направит меня "на путь истинный".

В Tcl'е - так там вышепреведенный способ используется сплошь и рядом. Как надо делать в JS - к сожалению, не знаю.

Последний раз редактировалось Скриптор, 13.02.2010 в 21:50.
Ответить с цитированием
  #8 (permalink)  
Старый 13.02.2010, 21:31
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от Скриптор
посоветуйте рабочую альтернативу
я уже писал:
Сообщение от Octane
Лучший вариант — хранить данные (массивы) в объекте:
var data = {
    abc: […],
    bcd: […],
    cde: […]
};

тогда обращение к свойству объекта (массиву) будет осуществлятся следующим образом:
data["abc"]
Ответить с цитированием
  #9 (permalink)  
Старый 13.02.2010, 21:55
Аватар для Скриптор
Аспирант
Отправить личное сообщение для Скриптор Посмотреть профиль Найти все сообщения от Скриптор
 
Регистрация: 05.02.2010
Сообщений: 35

Этот пример я вполне понял.

Возможно, на первый взгляд, я умножаю сущности, но в моем примере имя массива (или подмассива) заранее не известно, а выводится в процессе выполнения кода (что я и называю "динамическим получением" его имени), потому что зависит от ряда условий.

Можно, наверное, переписать все как многомерный массив, но я боюсь, что достигнув этим некоторой компактности, я сам запутаюсь. А читабельность и "прозрачность" кода (по крайней мере для меня) - важны.
Ответить с цитированием
  #10 (permalink)  
Старый 13.02.2010, 22:01
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Куча глобальных переменных — зло.


Сообщение от Скриптор
но в моем примере имя массива (или подмассива) заранее не известно
что здесь мешает сформировать имя свойства?
data["имя" + "массива"][индекс_элемента_в_массиве]

или
var data = {
    abc: [7,8,22],
    bcd: [8]
};

var cde = ["mbp", "abc", "bcd"];

data[cde[1]][2]           // ==> 22


Сообщение от Скриптор
А читабельность и "прозрачность" кода (по крайней мере для меня) - важны.
То есть для вас удобнее искать глобальные переменные, нежели посмотреть на структурированные в виде объекта данные?

Последний раз редактировалось Octane, 13.02.2010 в 22:04.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое имя переменной igorska Сайт Javascript.ru 1 14.09.2009 12:15
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53
вставка элементов массива в текстовую форму по клику olezyk Общие вопросы Javascript 3 21.03.2009 22:01
формирование обьекта или массива на основе полей формы birst Общие вопросы Javascript 1 05.12.2008 17:50
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00