【问题标题】:How do I create dynamic variable names inside a loop?如何在循环中创建动态变量名称?
【发布时间】:2012-01-05 19:20:03
【问题描述】:

我正在编写一个 ajax 谷歌地图脚本,我需要在 for 循环中创建动态变量名。

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

我想要得到的是:marker0marker1marker2等等。 我猜marker+i有问题

Firebug 给了我这个:missing ; before statement

【问题讨论】:

  • 我认为您需要提供更多上下文以获得更好的答案。 “计算变量名称”是什么意思?标记是否在循环之外的某个地方定义?
  • 是的 - 如果你搜索 Javascript 数组,你会得到答案,教程 - 有时很难说出你想要的东西。很公平。

标签: javascript jquery google-maps


【解决方案1】:

为此使用数组。

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

【讨论】:

  • 这是从 coords.length 编辑到 markers.length -- 在我拒绝之前获得批准。我认为编辑是错误的——你为什么要遍历一个空对象?
  • 如果我想使用destination[1]address、destination[1]description、destination[1]name怎么办?
  • 这不能回答问题。当您从谷歌搜索到这里寻找问题的解决方案时,看到这些答案很痛苦。我认为作为一个社区,我们需要停止这样做。
  • @JohnP 它没有回答标题中写的问题(“我如何创建动态变量”)。足够公平,它被标记为答案。当您使用 Google 查找答案而最佳答案不是您所期望的时,这令人沮丧。
  • @EdwardD'Souza 答案与问题完全相关。 OP 正在询问如何创建一组变量并能够在不知道需要多少变量的情况下稍后引用它。答案显示了如何在数组中创建这些值而不污染全局范围。
【解决方案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 的这个有点奇怪的特性很少使用(有充分的理由),但在某些情况下它可能很有用。

【讨论】:

  • 为什么要冲出范围扔到窗户上???那只是在乞求以后的问题。
  • 是的——它会起作用——只是稍后选择一个值可能会有问题。
  • 需要这个并在这里得到它。有时知道不同的路径是件好事。
  • 这个解决方案帮助了我。在我的情况下,“一些东西”是一个数组,所以我一直在寻找没有嵌套数组的解决方案(只是因为它更容易维护)。非常感谢!
  • 使用 this - 它总是指当前范围”。不,它没有。 this 与作用域无关,它是由调用或 bind 设置的执行上下文的参数,并且在每次调用 a 时可能是不同的值功能。在严格模式下它可能是undefined(尽管严格模式是在 2011 年 6 月的 ECMA-262 ed 5 中引入的)。
【解决方案3】:

试试这个

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

【讨论】:

  • 感谢您回答问题。当然每个人都知道数组更好,但有时,你需要做一些非正统的事情。
【解决方案4】:

关于迭代变量名,我喜欢使用Template literals 制作动态变量。每个 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;  */
}

当我通过 API 破解我的方式时,我做了这个小循环 sn-p 来查看行为,具体取决于与 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】:

    在这个 dynamicVar 中,我正在创建动态变量“ele[i]”,我将根据索引将“arr”的值/元素放入其中。 ele在初始阶段为空,所以我们将数组“ele”中的“arr”元素复制。

    function dynamicVar(){
                var arr = ['a','b','c'];
                var ele = [];
                for (var i = 0; i < arr.length; ++i) {
                    ele[i] = arr[i];
     ]               console.log(ele[i]);
                }
            }
            
            dynamicVar();
    

    【讨论】:

      【解决方案7】:
      var marker  = [];
      for ( var i = 0; i < 6; i++) {               
           marker[i]='Hello'+i;                    
      }
      console.log(marker);
      alert(marker);
      

      【讨论】:

      • 请考虑在您的答案中添加一个简短的解释,以便问题作者能够更好地理解您的所作所为
      • 并解释与之前答案的区别
      【解决方案8】:
       var marker+i = "some stuff";
      

      可以这样解释: 创建一个名为标记的变量(未定义);然后添加到 i;然后尝试为表达式的结果赋值,不可能。 萤火虫的意思是这样的: 变量标记; i = '一些东西'; 这就是萤火虫在标记之后和 i 之前期望的逗号; var 是一个语句,并且(显然)不接受表达式。 不是很好的解释,但我希望它有所帮助。

      【讨论】:

      • Hamid,他解释了为什么它不起作用,这不应该是一个有效的解决方案。
      猜你喜欢
      • 2018-08-20
      • 2011-09-15
      • 2015-03-06
      • 2019-11-28
      • 2015-09-10
      • 2021-11-18
      • 1970-01-01
      • 2021-12-24
      • 2011-07-14
      相关资源
      最近更新 更多