Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Динамическое имя вызываемого массива (https://javascript.ru/forum/misc/7655-dinamicheskoe-imya-vyzyvaemogo-massiva.html)

Скриптор 13.02.2010 02:37

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


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


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

Octane 13.02.2010 11:50

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

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



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

window["abc"]



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


Вообще это основы JavaScript, читайте теорию.

Скриптор 13.02.2010 15:17

Первый случай очевидный - именно так и делаю.
Третий (использование eval) - так и не понял.
А вариант с window - то, что доктор прописал. Спасибо, Octane.

Скриптор 13.02.2010 15:36

Цитата:

К глобальным массивам можно обратится так:
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 17:46

Цитата:

Хотелось бы чего-то наподобие:
Код:

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]


Блин!.. Главный, секрет был в "скобочках", вернее кавычечках! :lol:


Следовало так (может кому и пригодится):
Код:

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 отличий!":haha: ( В следующий раз я ради перестраховки буду кавычить даже числа! )


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

Было б здорово, если б у кого-то дошли руки описать подобные трюки.

Octane 13.02.2010 18:18

Цитата:

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

Было б здорово, если б у кого-то дошли руки описать подобные трюки.

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

У вас проблемы с архитектурой приложения, раз так приходится обращаться к массивам.

Скриптор 13.02.2010 21:26

Цитата:

Сообщение от Octane (Сообщение 44676)
У вас проблемы с архитектурой приложения, раз так приходится обращаться к массивам.

Ну, Octane, раз уж Ваш уровень позволяет ставить диагноз заочно - посоветуйте рабочую альтернативу! :-?

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

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

Octane 13.02.2010 21:31

Цитата:

Сообщение от Скриптор
посоветуйте рабочую альтернативу

я уже писал:
Цитата:

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

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


Скриптор 13.02.2010 21:55

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

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

Можно, наверное, переписать все как многомерный массив, но я боюсь, что достигнув этим некоторой компактности, я сам запутаюсь. А читабельность и "прозрачность" кода (по крайней мере для меня) - важны.

Octane 13.02.2010 22:01

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


Цитата:

Сообщение от Скриптор
но в моем примере имя массива (или подмассива) заранее не известно

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

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

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

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


Цитата:

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

То есть для вас удобнее искать глобальные переменные, нежели посмотреть на структурированные в виде объекта данные?


Часовой пояс GMT +3, время: 16:53.