如何在循环内创建动态变量名?

Phi*_*ann 51 javascript jquery google-maps

我正在研究ajax谷歌地图脚本,我需要在for循环中创建动态变量名称.

for (var i = 0; i < coords.length; ++i) {
    var marker+i = "some stuff";
}
Run Code Online (Sandbox Code Playgroud)

我想的是:marker0,marker1,marker2等.我猜有些问题marker+i

Firebug给了我这个: missing ; before statement

Joh*_*hnP 96

为此使用数组.

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

  • 这不能回答问题。当您从Google搜索中寻找问题的解决方案时,看到这些答案很痛苦。我认为,作为一个社区,我们需要停止这样做。 (4认同)
  • @ EdwardD'Souza答案与问题完全相关.OP询问如何创建一组变量,并能够在不知道需要多少变量的情况下稍后引用它.答案显示了如何在数组中创建这些值而不污染全局范围. (4认同)
  • 嘿,我完全忘了谢谢你!我让它工作了;) (2认同)
  • 如果我要使用目标[1]地址,目标[1]描述,目标[1]名称怎么办? (2认同)
  • @JohnP它没有回答标题中所写的问题(“如何创建动态变量”)。很公平,它被标记为答案。当您使用 Google 寻找答案而最重要的答案不是您所期望的时,这真是令人沮丧。 (2认同)

Tod*_*orf 47

我同意通常最好使用一个Array.

但是,这也可以通过简单地使用- 总是引用当前范围,通过简单地向当前范围(全局范围,如果是顶级代码; 函数范围,如果在函数内)添加属性,在JavaScript中完成this.

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

您稍后检索存储的值(如果您在设置它们的范围内):

var foo = this.marker0;
console.log(foo); // "some stuff"
Run Code Online (Sandbox Code Playgroud)

JavaScript的这个有点奇怪的功能很少使用(有充分理由),但在某些情况下它可能很有用.

  • 为什么要突破范围并把它扔到窗口上??? 那只是在以后乞求问题. (5认同)
  • 需要这个,并在这里得到它.有时知道不同的路径是好的. (4认同)
  • 这个解决方案帮了我 在我的情况下,"some stuff"是一个数组,所以我一直在寻找没有嵌套数组的解决方案(因为它更容易维护).非常感谢! (3认同)
  • "*使用此 - 总是指当前范围*".不,不.*this*与作用域无关,它是由调用设置的执行上下文的参数,或*bind*,并且在每次调用函数时可能是不同的值.在严格模式下可能是*undefined*(尽管2011年6月ECMA-262 ed 5引入了严格模式). (3认同)
  • 雅 - 它会工作 - 稍后选择一个值可能会有问题. (2认同)

小智 14

试试这个

window['marker'+i] = "some stuff"; 
Run Code Online (Sandbox Code Playgroud)


kay*_*eck 5

关于迭代变量名称,我喜欢使用Template常量来创建动态变量。每个Tom,Dick和Harry都使用数组样式,这很好。在使用数组动态变量之前,天哪!眼出血超负荷。由于模板文字目前支持有限,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;  */
}
Run Code Online (Sandbox Code Playgroud)

当我通过API侵入自己的方式时,我制作了这个小循环代码段以查看行为,具体取决于对Template文字(与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]  */
}
Run Code Online (Sandbox Code Playgroud)

  • 这是动态变量的纯解决方案 (2认同)
  • 这里唯一能够满足我的需求的解决方案。比“使用数组”的接受答案要好得多。谢谢! (2认同)