Как ссылаться на переменную динамически в JavaScript - PullRequest
8 голосов
/ 01 октября 2010

Я пытаюсь ссылаться на переменную динамически в JavaScript

Я пытаюсь вызвать переменную amtgc1 # (где # варьируется от 1-7)

Я использую оператор whileцикл, и значение переменной подсчета в моем операторе while соответствует последней цифре переменной, которую я пытаюсь вызвать.

Например:

            var inc=3;
            var step=0;
            while(step < inc){
                var dataString = dataString + amtgc1#;
                var step = step+1;
            }

Где # основано на значении переменной "step".Как мне это сделать?Любая помощь приветствуется!Спасибо !!

Ответы [ 7 ]

8 голосов
/ 01 октября 2010

Вместо того, чтобы определять amtgc1[1-7] как 7 различных переменных, вместо этого создайте их экземпляр как массив.Таким образом, ваш код сервера будет выдавать:

var amtgc1 = [<what used to be amtgc11>,<what used to be amtgc12>, ...insert the rest here...];

Затем вы можете ссылаться на них в цикле, используя синтаксис массива:

var dataString = dataString + amtgc1[step];
5 голосов
/ 01 октября 2010

Единственный способ сделать это (afaik) - это выбросить все ваши переменные amtgc1 # в объект, такой как:

myVars = {
  amtgc1: 1234,
  amtgc2: 12345,
  amtgc3: 123456,
  amtgc4: 1234567
};

Тогда вы можете ссылаться на него как

myVars["amtgc" + step];
2 голосов
/ 01 октября 2010

Как насчет:

var dataString = dataString + eval('amtgc1' + step);
0 голосов
/ 17 января 2018

Это правда, что eval() не всегда рекомендуется, но это будет работать.В противном случае, в зависимости от области действия, вы можете ссылаться на большинство вещей, таких как объект в JavaScript.Тем не менее, вот примеры того, что вы можете сделать.

Глобальная область действия

var MyGlobalVar = 'secret message';
var dynamicVarName = 'MyGlobalVar';
console.log(window.[dynamicVarName]);

Область действия

function x() {
  this.df = 'secret';
  console.log(this['df']);
}
x();
0 голосов
/ 07 февраля 2015

Я построил способ, которым вы могли бы решить эту проблему, используя объекты для хранения значений ключа, где ключом будет ссылка на задачу, а значением будет действие (функция), и вы можете использовать if внутриЦикл проверки текущей задачи и запуска действий.

Если вы хотите сравнить динамически объединяющиеся строки с переменной, вы должны использовать функцию eval ().

/* store all tasks references in a key value, where key will be
*  the task reference and value will be action that the task will 
*  Execute
*/
var storeAllTasksRefer = {

    amtgc11:function(){ alert("executing task amtgc11"); },
    amtgc112:function(){ alert("executing task amtgc112"); },
    "amtgc1123":"amtgc1123"
    // add more tasks here...

};

var inc = 7;
var step = 1;
var dataString = 'amtgc1';

while(step <= inc){

     var dataString = dataString + step;
     //alert(dataString); // check its name;
     step = step+1;

     // check if it is my var
    if( dataString  == 'amtgc112' ){

         // here I will reference my task
         storeAllTasksRefer.amtgc112();             


     }// end if

     /* you can also compare dynamically using the eval() function */
     if('amtgc1123' == eval('storeAllTasksRefer.'+dataString)){

        alert("This is my task: "+ eval('storeAllTasksRefer.'+dataString));

     } // end this if

} // end while

ЗдесьПример работы в реальном времени: http://jsfiddle.net/danhdds/e757v8ph/

Ссылка на функцию eval (): http://www.w3schools.com/jsref/jsref_eval.asp

0 голосов
/ 01 октября 2010

Если ваши amtgc1* переменные определены как свойство объекта, вы можете ссылаться на них по имени. Предполагая, что они объявлены в глобальной области видимости, они будут членами объекта window.

        var inc=7; 
        var step=0; 
        while(step < inc){ 
            var dataString = dataString + window['amtgc1'+(step+1)]; 
            var step = step+1; 
        } 

Если они определены в другой области (в пределах функции), но не принадлежат ни к какому другому объекту, вы застряли на eval, что обычно считается плохим.

также, ура for петли!

        var inc=7; 
        for ( var step=0; step < inc; step++ ){ 
            var dataString = dataString + window['amtgc1'+(step+1)]; 
         } 
0 голосов
/ 01 октября 2010

Не проверено, но не могу понять, почему вы не можете сделать это ...

$('#amtgc1' + step).whatever();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...