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
Utilisez un tableau pour cela.
var markers = [];
for (var i = 0; i < coords.length; ++i) {
markers[i] = "some stuff";
}
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.
Essaye ça
window['marker'+i] = "some stuff";
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] */
}
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);
}