2010-08-25 47 views
6

Decir que tengo la siguiente JS:¿Puedo hacer referencia a una variable usando una cadena?

var foo_index = 123; 
var bar_index = 456; 

Y el código HTML siguiente:

<div id="foo"></div> 
<div id="bar"></div> 

Entonces me gustaría decir esto:

thisIndex = this.id + '_index' 

Y me gustaría que thisIndex sea un número. ¿Cómo convierto la cadena, que es exactamente el nombre de la variable, en una variable?

+1

comentario relacionado Semi: esta pregunta me ha hecho comprender el poder del símbolo '' $ en PHP. – BoltClock

+2

potencia? Llamaría a eso 'mal uso' – shylent

+0

Es posible, pero mal diseño.(incluso en PHP, BoltClock). En su lugar, puede utilizar una matriz (javascript array se puede usar como hash maps) o tal vez alguna otra característica de javascript (hay muchas posibilidades en javascript y su muestra realmente no muestra qué quieres estar haciendo). – Jasper

Respuesta

10

Puede. Si foo_index y bar_index son variables globales, sólo tiene que hacer:

var thisIndex = window[this.id + '_index']; 
+0

Eso es bastante útil saber. Gracias. –

+0

+1 Esta debería haber sido la respuesta correcta, ya que no requiere que el solicitante cambie su código. –

+0

No veo por qué no acepté esto como la respuesta la primera vez. No usé este método esa vez, pero es una joya. Gracias de nuevo. –

11

se debería poner las variables en un objeto, como esto:

var indices = { 
    foo: 123, 
    bar: 456 
}; 

var thisIndex = indices[this.id]; 

Este código utiliza JSON sintaxis un objeto literal para definir un objeto con dos propiedades y usos [] acceder a una propiedad por su nombre.

También puede escribir

var indices = new Object; 
indices.foo = 123; 
indices["bar"] = 456; 
+2

Lo tienes completamente al revés. Es JSON que usa un subconjunto de la sintaxis de Javascript. Este es un objeto Javascript, y no tiene nada que ver con JSON. – Guffa

+0

@Guffa: me doy cuenta de eso. Sin embargo, la sintaxis suele denominarse sintaxis JSON. ¿Como lo llamarias? – SLaks

+2

@SLaks: es un objeto literal. La sintaxis ha existido mucho antes de que JSON existiera, por lo que es muy reciente que las personas han comenzado (incorrectamente) a referirse a ella como sintaxis JSON. – Guffa

5

puede intentar utilizar la función eval:

http://www.w3schools.com/jsref/jsref_eval.asp

que hace exactamente lo que necesita.

+3

Pero muy, _muy_, lentamente. – SLaks

+4

Si está pensando en usar * eval() *, es probable que haya una forma mejor de hacer lo que está tratando de hacer (en este caso, la respuesta de SLaks). [Eval is Evil] (http://blogs.msdn.com/b/ericlippert/archive/2003/11/01/53329.aspx), por Eric Lippert es una buena lectura sobre el tema. –

1

Para responder a su pregunta, puede utilizar la función de eval para evaluar una cadena:

thisIndex = eval(this.id + '_index'); 

Sin embargo, el uso de la función eval es generalmente un signo de código mal construido. Creo que debería usar una matriz asociativa en su lugar:

var numbers = { foo: 123, bar: 456 }; 
thisIndex = numbers[this.id]; 
+0

, use JSON.parse, es mucho más seguro que eval. descarga json2.js en google. –

+0

@Martin: * JSON.parse() * no ayudaría aquí, solo analizará una cadena JSON, que no es la intención. –

1
window["myvar"] = 'hello'; 

alert(myvar); 
1

no estoy seguro de qué es lo que quiere lograr, pero tal vez este enfoque podría ser mejor (que depende de algunos factores como la versión de HTML utiliza como @Andy E puntos en comentarios a continuación):

<div id="foo" index="123"></div> 
<div id="bar" index="456"></div> 
<script> 
    var fooIndex = document.getElementById("foo").getAttribute("index"); 
</script> 

Aquí valor de index se mantiene junto con el elemento HTML correspondiente.

+0

Los atributos personalizados no están permitidos en HTML4 e invalidarán su marcado. Sin embargo, sería válido HTML5 si prefija los nombres de los atributos con * data- *, p. Ej. 'data-index =" 123 "'. –

+0

Es por eso que escribí "sería mejor". "podría" sería mejor. –

0

Creo que quieres algo como esto:

// put your properties in an object of some kind 
var dictionary = 
{ 
    foo_index: 123, 
    bar_index: 456 
}; 

// you can set further properties with property syntax 
dictionary.again_index = 789; 

// or dictionary syntax - same result 
dictionary['another_index'] = 012; 

// then function to get the number value from the index name becomes 
var thisIndex = Number(dictionary[this.id + '_index']); 
+0

¿Por qué llamas 'Número'? – SLaks

+0

@SLaks - Sí, realmente no necesito hacerlo, solo siendo explícito ya que el OP dijo que querían un número de regreso. – Keith

Cuestiones relacionadas