web-dev-qa-db-fra.com

Comment créer des noms de variables dynamiques dans une boucle?

Je travaille sur un script Google Maps ajax et je dois créer des noms de variables dynamiques dans une boucle for.

for (var i = 0; i < coords.length; ++i) {
    var marker+i = "some stuff";
}

Ce que je veux obtenir, c'est: marker0, marker1, marker2 etc. et je suppose qu'il y a quelque chose qui ne va pas avec marker+i

Firebug me donne ceci: missing ; before statement

47
Philipp Bergmann

Utilisez un tableau pour cela.

var markers = [];
for (var i = 0; i < coords.length; ++i) {
    markers[i] = "some stuff";
}
93
JohnP

Je conviens qu’il est généralement préférable d’utiliser un Array pour cela.

Cependant, ceci peut également être accompli en JavaScript en ajoutant simplement des propriétés à la portée actuelle (portée globale, si code de niveau supérieur; portée de la fonction, si elle est dans une fonction ) en utilisant simplement this - qui fait toujours référence à la portée actuelle.

for (var i = 0; i < coords.length; ++i) {
    this["marker"+i] = "some stuff";
}

Vous pouvez récupérer ultérieurement les valeurs stockées (si vous vous trouvez dans la même portée que lors de leur définition):

var foo = this.marker0;
console.log(foo); // "some stuff"

Cette fonctionnalité légèrement étrange de JavaScript est rarement utilisée (avec de bonnes raisons), mais dans certaines situations, elle peut être utile.

45
Todd Ditchendorf

Essaye ça

window['marker'+i] = "some stuff"; 
14
Safiq

En ce qui concerne les noms de variables itératives, j'aime créer des variables dynamiques en utilisant Littéraux de modèle . Chaque Tom, Dick et Harry utilise le style array, ce qui est bien. Jusqu'à ce que vous travailliez avec des tableaux et des variables dynamiques , oh mon dieu! Surcharge oculaire. Puisque les littéraux de modèle ont un support limité en ce moment, eval() est même une autre option.

v0 = "Variable Naught";
v1 = "Variable One";

for(i = 0; i < 2; i++)
{//console.log(i) equivalent is console.log(`${i}`)
  dyV = eval(`v${i}`);
  console.log(`v${i}`); /* => v0;   v1;  */      
  console.log(dyV);  /* => Variable Naught; Variable One;  */
}

Lorsque je parcourais les API, j'ai créé ce petit fragment de boucle pour voir le comportement en fonction de ce qui était fait avec les littéraux de modèle comparés à Ruby. J'aimais plus le comportement de Ruby; avoir besoin d'utiliser eval() pour obtenir la valeur est un peu boiteux lorsque vous êtes habitué à l'obtenir automatiquement.

_0 = "My first variable"; //Primitive
_1 = {"key_0":"value_0"}; //Object
_2 = [{"key":"value"}]    //Array of Object(s)


for (i = 0; i < 3; i++)
{
  console.log(`_${i}`);           /*  var
                                   * =>   _0  _1  _2  */

  console.log(`"_${i}"`);         /*  var name in string  
                                   * => "_0"  "_1"  "_2"  */

  console.log(`_${i}` + `_${i}`); /*  concat var with var
                                   * => _0_0  _1_1  _2_2  */

  console.log(eval(`_${i}`));     /*  eval(var)
                                   * => My first variable
                                        Object {key_0: "value_0"}
                                        [Object]  */
}
4
kayleeFrye_onDeck

Vous pouvez utiliser la méthode eval () pour déclarer des variables dynamiques. Mais mieux vaut utiliser un tableau.

for (var i = 0; i < coords.length; ++i) {
    var str ="marker"+ i+" = undefined";
    eval(str);
}
3
Md Junaid Alam