Подтвердить что ты не робот

Как создать динамические имена переменных внутри цикла?

Я работаю над картами ajax google script, и мне нужно создать имена динамических переменных в цикле for.

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

Я хочу получить: marker0, marker1, marker2 и т.д. и я думаю, что что-то не так с marker+i

Firebug дает мне это: missing ; before statement

4b9b3361

Ответ 1

Используйте массив для этого.

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

Ответ 2

Я согласен, что для этого обычно предпочтительнее использовать Array.

Однако это также может быть достигнуто в JavaScript, просто добавляя свойства в текущую область (глобальную область, если код верхнего уровня; область функции, если внутри функции), просто используя this - который всегда ссылается на текущую область.

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

Позже вы можете извлечь сохраненные значения (если вы находитесь в той же области, в которой они были установлены):

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

Эта немного странная особенность JavaScript используется редко (по уважительной причине), но в определенных ситуациях она может быть полезна.

Ответ 3

Попробуйте это

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

Ответ 4

Что касается имен итеративных переменных, мне нравится делать динамические переменные, используя литералы шаблонов. Каждый Том, Дик и Гарри используют стиль массива, и это прекрасно. Пока вы не работаете с массивами и динамическими переменными, о мальчик! Перегрузка глаз. Поскольку литералы Template имеют ограниченную поддержку прямо сейчас, eval() - еще один вариант.

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;  */
}

Когда я взламывал свой путь через API, я сделал этот маленький фрагмент цикла, чтобы увидеть поведение в зависимости от того, что было сделано с литералами шаблона, по сравнению, скажем, с Ruby. Мне больше нравилось поведение Ruby; необходимо использовать eval(), чтобы получить значение, как бы хромающее, когда вы привыкли автоматически получать его.

_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]  */
}

Ответ 5

Вы можете использовать метод eval() для объявления динамических переменных. Но лучше использовать массив.

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

Ответ 6

<script>
var markers=[];
for (var i=0; i<5; ++i){
    window['m'+i]=i;}
alert(m1);
alert(m2);
alert(m3);
</script>

Ответ 7

 var marker+i = "some stuff";

coudl интерпретироваться так: создать переменную с именем marker (undefined); затем добавьте к i; затем попытайтесь присвоить значение результату выражения, невозможно. Что говорит этот firebug: var marker; я = 'некоторые вещи'; это то, что firebug ожидает запятую после маркера и до i; var - это утверждение и не принимает (по-видимому) выражения. Не очень хорошее объяснение, но я надеюсь, что это поможет.