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

IT技术 javascript jquery google-maps
2021-01-18 19:55:11

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

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

我想得到的是:marker0, marker1,marker2等等。我想有什么问题marker+i

Firebug 给了我这个: missing ; before statement

6个回答

为此使用数组。

var markers = [];
for (var i = 0; i < coords.length; ++i) {
    markers[i] = "some stuff";
}
@JohnP 它没有回答标题中写的问题(“我如何创建动态变量”)。很公平,它被标记为答案。当您使用 Google 查找答案并且最佳答案不是您所期望的时,这令人沮丧。
2021-03-21 19:55:11
这不能回答问题。当您从谷歌搜索来到这里寻找问题的解决方案时,很难看到这些答案。我认为我们需要停止这样做,作为一个社区。
2021-04-03 19:55:11
@EdwardD'Souza 答案与问题完全相关。OP 正在询问如何创建一组变量,并在不知道需要多少变量的情况下稍后引用它。答案显示了如何在数组中创建这些值而不污染全局范围。
2021-04-05 19:55:11
如果我想使用目的地[1]地址、目的地[1]描述、目的地[1]名称怎么办?
2021-04-06 19:55:11
这是从 coords.length 编辑到markers.length——在我拒绝之前就被批准了。我认为编辑是错误的——你为什么要遍历一个空对象?
2021-04-09 19:55:11

我同意通常最好为此使用 an 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 的这个有点奇怪的特性很少使用(有充分的理由),但在某些情况下它可能很有用。

为什么冲出瞄准镜扔到窗户上???那只是在乞求以后的问题。
2021-03-20 19:55:11
是的 - 它会起作用 - 稍后仅选择一个值可能会出现问题。
2021-03-25 19:55:11
这个解决方案帮助了我。在我的例子中,“一些东西”是一个数组,所以我正在寻找没有嵌套数组的解决方案(只是因为它更容易维护)。非常感谢!
2021-03-28 19:55:11
需要这个并在这里得到它。有时知道不同的路径是好的。
2021-04-01 19:55:11
使用 this - 它总是指当前范围”。不,它没有。与作用域无关,它是由调用或bind设置的执行上下文的参数,并且在每次调用函数时可能是不同的值。它可能在严格模式下未定义的(尽管严格模式是在 2011 年 6 月的 ECMA-262 第 5 版中引入的)。
2021-04-06 19:55:11

试试这个

window['marker'+i] = "some stuff"; 
感谢您回答问题。当然每个人都知道数组更好,但有时,您需要做一些非正统的事情。
2021-03-12 19:55:11

关于迭代变量名,我喜欢使用模板文字制作动态变量每个 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 破解我的方式时,我制作了这个小循环片段来查看行为,这取决于与 Ruby 相比,模板文字所做的事情。我更喜欢Ruby的行为;需要使用eval()获得的value是一种跛脚的,当你使用自动得到它。

_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]  */
}
这里唯一能满足我需求的解决方案。比“使用数组”的公认答案要好得多。谢谢!
2021-03-23 19:55:11
这是动态变量的纯解决方案
2021-04-02 19:55:11

您可以使用 eval() 方法来声明动态变量。但最好使用数组。

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