2010-09-30 3 views
7

Sto cercando di fare riferimento a una variabile dinamicamente in javascriptcome fare riferimento a una variabile dinamicamente in javascript

La variabile che sto cercando di chiamata è amtgc1 # (dove # varia da 1-7)

Sono utilizzando un'istruzione while per eseguire il ciclo, e il valore della variabile di conteggio nella mia istruzione while corrisponde all'ultima cifra della variabile che sto tentando di chiamare.

Per esempio:

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

Dove # è basata sul valore del "passo" variabile. Come procedo a fare questo? Qualsiasi aiuto è apprezzato! Grazie!!

risposta

7

Piuttosto che definendo amtgc1[1-7] come 7 diverse variabili, istanziate invece come una matrice. Così il vostro codice del server emetterebbe:

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

Quindi, è possibile fare riferimento a loro nel vostro ciclo utilizzando la sintassi array:

var dataString = dataString + amtgc1[step]; 
+0

ero solo a colpire Messaggio quando i "5 miliardi di nuove risposte sono state pubblicate" spuntato. questo è più o meno quello che stavo per dire. – Patricia

4

L'unico modo è possibile farlo (afaik) è quello di gettare tutti i tuoi amtgc1 # Vars in un oggetto come ad esempio:

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

Quindi è possibile fare riferimento a esso come

myVars["amtgc" + step]; 
2

ne dite:

var dataString = dataString + eval('amtgc1' + step); 
+3

funzionerà, ma eval è malvagio e dovrebbe essere evitato quando un passaggio alla sintassi array o alla letterale dell'oggetto sarà sufficiente. –

+0

Questo è il modo più semplice per farlo e funziona. L'ho provato proprio adesso funziona perfettamente. Non devo cambiare nessuno dei miei codici esistenti. Grazie Jakub! –

+0

Perché è cattivo? –

0

Non testato, ma può capisco perché non puoi farlo ...

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

+1

Solo se le variabili sono elementi dom con ID. –

0

Se le vostre variabili amtgc1* sono definite come proprietà di un oggetto, è possibile fare riferimento a esse per nome. Supponendo che siano dichiarati nell'ambito globale, saranno membri dell'oggetto window.

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

Se sono definiti in un ambito diverso (all'interno di una funzione), ma non appartenenti a qualsiasi altro oggetto, sei bloccato con eval, che è generalmente considerato male.

anche, hoouray for loop!

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

ho costruito un modo che si potrebbe risolvere questo problema utilizzando oggetti per memorizzare i valori chiave, in cui la chiave sarebbe il riferimento al compito e il valore sarà l'azione (funzione) e si potrebbe utilizzare un se all'interno del ciclo per controllare l'attività corrente e le azioni di innesco.

Se si desidera confrontare dinamicamente concatenando stringhe con "variabile", è necessario utilizzare la funzione 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 

Ecco l'esempio vivo: http://jsfiddle.net/danhdds/e757v8ph/

funzione

eval() di riferimento: http://www.w3schools.com/jsref/jsref_eval.asp

0

E 'vero che eval() non è sempre consigliato, ma che avrebbe funzionato. Altrimenti, a seconda dell'ambito, puoi fare riferimento a molte cose come un oggetto in JavaScript. Detto questo, ecco alcuni esempi di cosa puoi fare.

portata globale

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

Ambito Funzione

function x() { 
    this.df = 'secret'; 
    console.log(this['df']); 
} 
x();