2010-09-30 21 views
7

que estoy tratando de hacer referencia a una variable dinámicamente en javascriptcómo hacer referencia a una variable dinámicamente en javascript

La variable que estoy tratando de llamar es amtgc1 # (donde # varía de 1-7)

soy usando una sentencia while para recorrer, y el valor de la variable de conteo en mi sentencia while corresponde con el último dígito de la variable que estoy tratando de invocar.

Por ejemplo:

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

Donde # se basa en el valor de la "paso" variable. ¿Cómo voy a hacer esto? ¡Cualquier ayuda es apreciada! ¡¡Gracias!!

Respuesta

7

vez que definir amtgc1[1-7] como 7 variables diferentes, instanciarlas como una matriz en su lugar. Por lo que su código de servidor emitiría:

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

A continuación, puede hacer referencia a ellos en su bucle usando gama sintaxis:

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

yo estaba a punto de salir del anuncio cuando los "5 mil millones de nuevas respuestas se han publicado" aparecido. esto es más o menos lo que iba a decir. – Patricia

4

La única manera de hacer esto (que yo sepa) es tirar todas sus amtgc1 # VARs en un objeto, como:

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

A continuación, se puede hacer referencia a ella como

myVars["amtgc" + step]; 
2

¿Qué tal:

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

esto funcionará, pero eval es malo y debería evitarse cuando un cambio a la sintaxis array o object-literal será suficiente. –

+0

Esta es la forma más fácil de hacerlo y funciona. Lo intenté ahora mismo, funciona perfectamente. No tengo que cambiar ninguno de mis códigos existentes. Gracias Jakub! –

+0

¿Por qué es malo? –

0
No

probado, pero puede No veo por qué no puede hacer esto ...

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

+1

Solo si las variables son elementos dom con ID. –

0

Si sus variables amtgc1* se definen como una propiedad de un objeto, puede hacer referencia a ellas por su nombre. Suponiendo que se declaran en el ámbito global, serán miembros del objeto window.

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

Si se definen en un ámbito diferente (dentro de una función), pero que no pertenecen a ningún otro objeto, que está pegado con eval, que generalmente se considera malo.

también, hooray for loops!

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

he construido de una manera que se podría resolver este problema utilizando objetos para almacenar los valores clave, donde la clave sería la referencia a la tarea y el valor será la acción (función) y se podía utilizar y si está dentro del ciclo para verificar la tarea actual y desencadenar acciones.

Si desea comparar dinámicamente concatenando cadenas con "variable", debe usar la función 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 

Aquí es el ejemplo vivo: http://jsfiddle.net/danhdds/e757v8ph/

función eval() referencia: http://www.w3schools.com/jsref/jsref_eval.asp

0

Es cierto que eval() no siempre es recomendable, pero que iba a funcionar. De lo contrario, dependiendo del alcance, puede hacer referencia a la mayoría de las cosas, como un objeto en JavaScript. Dicho esto, aquí hay ejemplos de lo que puedes hacer.

alcance global

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

Función Ámbito

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