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.
|
|
13.02.2010, 11:50
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Лучший вариант — хранить данные (массивы) в объекте:
var data = {
abc: […],
bcd: […],
cde: […]
};
тогда обращение к свойству объекта (массиву) будет осуществлятся следующим образом:
data["abc"]
К глобальным массивам можно обратится так:
var abc = […], bcd = […], cde = […];
window["abc"]
Для локальных областей можно использовать eval, но лучше так не делать:
eval("var array = abc;");
Вообще это основы JavaScript, читайте теорию.
|
|
13.02.2010, 15:17
|
|
Аспирант
|
|
Регистрация: 05.02.2010
Сообщений: 35
|
|
Первый случай очевидный - именно так и делаю.
Третий (использование eval) - так и не понял.
А вариант с window - то, что доктор прописал. Спасибо, Octane.
|
|
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.
|
|
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 отличий!" ( В следующий раз я ради перестраховки буду кавычить даже числа! )
Самое странное, что как-то в примерах мануалов подобных удобных примеров не было! Может быть для кого-то это очевидно, но скорее для самого автора мануала
Было б здорово, если б у кого-то дошли руки описать подобные трюки.
|
|
13.02.2010, 18:18
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от Скриптор
|
Самое странное, что как-то в примерах мануалов подобных удобных примеров не было! Может быть для кого-то это очевидно, но скорее для самого автора мануала
Было б здорово, если б у кого-то дошли руки описать подобные трюки.
|
А что тут неочевидного? Что может быть подставлено вместо имени свойства, если не строка?
У вас проблемы с архитектурой приложения, раз так приходится обращаться к массивам.
|
|
13.02.2010, 21:26
|
|
Аспирант
|
|
Регистрация: 05.02.2010
Сообщений: 35
|
|
Сообщение от Octane
|
У вас проблемы с архитектурой приложения, раз так приходится обращаться к массивам.
|
Ну, Octane, раз уж Ваш уровень позволяет ставить диагноз заочно - посоветуйте рабочую альтернативу!
Я достаточно слеп, чтобы делать только то и так, как это я сейчас делаю.
Но буду благодарен, всякому кто направит меня "на путь истинный".
В Tcl'е - так там вышепреведенный способ используется сплошь и рядом. Как надо делать в JS - к сожалению, не знаю.
Последний раз редактировалось Скриптор, 13.02.2010 в 21:50.
|
|
13.02.2010, 21:31
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от Скриптор
|
посоветуйте рабочую альтернативу
|
я уже писал:
Сообщение от Octane
|
Лучший вариант — хранить данные (массивы) в объекте:
var data = {
abc: […],
bcd: […],
cde: […]
};
тогда обращение к свойству объекта (массиву) будет осуществлятся следующим образом:
data["abc"]
|
|
|
13.02.2010, 21:55
|
|
Аспирант
|
|
Регистрация: 05.02.2010
Сообщений: 35
|
|
Этот пример я вполне понял.
Возможно, на первый взгляд, я умножаю сущности, но в моем примере имя массива (или подмассива) заранее не известно, а выводится в процессе выполнения кода (что я и называю "динамическим получением" его имени), потому что зависит от ряда условий.
Можно, наверное, переписать все как многомерный массив, но я боюсь, что достигнув этим некоторой компактности, я сам запутаюсь. А читабельность и "прозрачность" кода (по крайней мере для меня) - важны.
|
|
13.02.2010, 22:01
|
|
|
Регистрация: 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.
|
|
|
|