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

94

我正在开发一个Ajax Google Maps脚本,需要在for循环中创建动态变量名。

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

我想要的是:marker0marker1marker2 等等。 但我猜测 marker+i 有什么问题。

Firebug 给出的错误信息是:missing ; before statement


2
我认为您需要给出更多的上下文以获得更好的答案。您所说的“count up var names”是什么意思?标记是否在循环外定义? - Zut
3
如果你搜索Javascript数组,你将会找到答案和教程。有时候很难准确表达自己想要的东西,这很正常。 - Piotr Kula
8个回答

133

使用数组来实现这个功能。

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

这个编辑从coords.length改成了markers.length -- 在我拒绝之前被批准了。我认为这个编辑是错误的 -- 为什么要循环遍历一个空对象? - Chris Wilson
2
如果我想使用destination[1]address、destination[1]description和destination[1]name怎么办? - Pitto
14
这个回答没有解答问题。当你从谷歌搜索来寻找解决问题的方法时,看到这种回答会让人感到痛苦。我认为作为一个社区,我们需要停止这样做。 - Edward D'Souza
2
@JohnP 这并没有回答标题中所写的问题(“如何创建动态变量”)。当然,它被标记为答案是公平的。但当你使用谷歌查找答案时,最好的答案不是你期望的,这真的很令人沮丧。 - Edward D'Souza
4
@EdwardD'Souza 这个答案与问题直接相关。楼主正在询问如何创建一组变量,并且能够在不知道需要多少变量的情况下稍后引用它。该答案展示了如何在数组中创建这些值,而不会污染全局作用域。 - JohnP
显示剩余3条评论

60

我同意通常最好使用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特性很少被使用(有很好的理由),但在某些情况下它可能会有用。


6
为什么要跳出范围,并将其扔在窗户上?这只会引发以后的问题。 - Andrew
2
是的-它是可行的-只是稍后选择一个值可能会有问题。 - Piotr Kula
4
需要这个并在这里得到了。有时候了解不同的道路是好事。 - ni8mr
3
这个解决方案对我很有帮助。在我的情况下,“一些东西”是一个数组,所以我正在寻找不需要嵌套数组的解决方案(仅因为它更容易维护)。非常感谢! - jazzgot
3
“using this - which always refers to the current scope”并不准确。this与作用域无关,它是执行上下文的参数,由调用或绑定设置,并且在每次函数调用时可能具有不同的值。在严格模式下,它可能为undefined(尽管严格模式是在2011年6月的ECMA-262 ed 5中引入的)。 - RobG
显示剩余2条评论

22

试试这个

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

1
感谢回答问题。当然,每个人都知道数组更好,但有时候你需要做一些非正统的事情。 - deps_stats

16

关于迭代变量名称,我喜欢使用模板字面量创建动态变量。每个人都使用数组样式,这很好。 直到你要同时处理数组和动态变量时,哦,天哪!会让你的眼睛受不了。由于模板字面量目前的支持有限,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]  */
}

2
这是一个针对动态变量的纯净解决方案。 - webdevanuj
2
这里唯一适合我的需求的解决方案。比“使用数组”的被接受答案好多了。谢谢! - Partack
1
我在函数中使用它来调用另一个函数,从超级函数的参数名称中调用:function wildname(evenwilder){eval(evenwilder)(wild1)} - Timo

2
你可以使用eval()方法来声明动态变量。但最好使用数组。
for (var i = 0; i < coords.length; ++i) {
    var str ="marker"+ i+" = undefined";
    eval(str);
}

你在这里同时使用了 evalarray - Timo
1
@Timo 什么数组?我没有使用数组。 - undefined

0
在这个 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();

-3
var marker  = [];
for ( var i = 0; i < 6; i++) {               
     marker[i]='Hello'+i;                    
}
console.log(marker);
alert(marker);

5
请考虑在您的回答中添加简要说明,以便问题的作者更好地理解您所做的事情。 - giuseppedeponte
并解释与以前的答案的区别 - Vasilisa

-7
 var marker+i = "some stuff";

可以这样解释: 创建一个名为marker的变量(未定义); 然后添加到i; 然后尝试将值分配给表达式的结果,不可能。 Firebug的意思是这样的: var marker; i = '一些东西'; 这就是Firebug在marker和i之间期望逗号的原因; var是一个语句,不接受表达式(显然)。 解释不太好,但希望有所帮助。


5
Hamid解释了为什么它行不通,这不应该是一个可行的解决方案。 - Filip Vondrášek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接