【问题标题】:Calling concatenated variables in Javascript在 Javascript 中调用连接变量
【发布时间】:2018-07-28 21:33:07
【问题描述】:

有没有办法在 javascript 循环的每次迭代中包含变量?例如,如果我将此代码放入循环中

if (e1) {item_text += '{id:"' + id[1] + '",lvl:' + e1lvl + '},<wbr>'} 
if (e2) {item_text += '{id:"' + id[2] + '",lvl:' + e2lvl + '},<wbr>'} // etc

然后做类似的事情

for (n = 0; n < id.length; n++) { 
  if (e/*concat var e w/var n?*/) { 
    item_text += '{id:"' + id[1] + '",lvl:' + e/*concat var e w/var n?*/lvl + '},<wbr>'
  }
}

有没有办法在每次迭代时更改 var 名称中的数字(e1 -> e2 等),还是我只需要长时间保持并将所有内容写在自己的行上?

【问题讨论】:

  • 这似乎是 X/Y 问题。你能发布你想要完成的事情吗?很可能有更简单的方法。

标签: javascript variables concatenation


【解决方案1】:

可能使用eval 来提供变量名:

const e1lvl1 = 'foo';
const e2lvl1 = 'bar';
for (let i = 1; i < 3; i++) {
  console.log(eval('e' + i + 'lvl1'));
}

但最好修复脚本的架构,这样就没有必要了:将每个e#lvl 放入一个数组,然后在每次迭代时访问数组的适当索引:

const elvl = [
  'foo',
  'bar'
];
let item_text = '';
for (let i = 0; i < elvl.length; i++) {
  item_text += 'lvl: ' + elvl[i] + '\n';
}
console.log(item_text);

【讨论】:

  • 像瘟疫一样避免eval()。如果你正在使用它,你很可能会以一种糟糕的方式编写代码,如果没有它就可以重构。
【解决方案2】:

JavaScript 中存在数组/对象是有原因的!简化您的代码。没有理由将 e1、e1l、e2... 作为变量。将它们添加到对象并通过键访问它们,或者将它们添加到数组中并循环访问它们。还有许多 javascript 函数可以让您确保所有元素都符合特定条件。

function submit() {
    var e = {};
    var idx = 28;
    
    for (var i = 0; i <= 24; i++) {
      e[i] = {};
      e[i].key = document.getElementById(`ench${i}`).checked
      e[i].value = $.trim(form.elements[idx].value)
      
      idx += 2;
    }
    
    // Check condition
    if (Object.values(e).some(e => e.key)) {
      //One of the checked items was true
    }
    
}

【讨论】:

    【解决方案3】:

    我同意您应该更改代码以使用数组。

    不过,要回答您的问题,由于您的 e1 和 e1lvl 变量看起来是全局范围的,您可以像这样访问它们

    window["e1"]
    window["e1lvl"]
    

    试试这个

    for (n = 0; n < id.length; n++) { 
      if (window["e" + n]) { 
        item_text += '{id:"' + id[n] + '",lvl:' + window["e" + n + "lvl"] + '},<wbr>';
      }
    }
    

    【讨论】:

    • 无法从发布的代码中得出结论,它们是全球性的。它们很可能是功能范围的。 (实际上,如果您查看他发布的链接,您会发现情况正是如此——它们不是全局的,它们是在一个函数中)
    • @CertainPerformance 很好,我没有注意到那个评论。这应该在问题的主体中。
    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 2021-10-09
    • 2012-10-01
    • 2012-10-05
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多