【问题标题】:Dynamically name variables javascript动态命名变量javascript
【发布时间】:2013-03-25 01:41:15
【问题描述】:

我需要在循环中动态创建变量,但我不知道如何。我已经阅读了有关使用eval(); 的信息,但我发现它只是动态更改变量内的值。

我需要这样的东西:

$(e).find('unidadeid').each(function () {
    countUnidades++;
    var Unidade[value inside countUnidades here] = $(this).text();
});

请清楚您的步骤。我要求的不是解决方案,而是寻求帮助,作为一种学习。谢谢;)

【问题讨论】:

  • 考虑改用Arrays
  • 不推荐使用 eval()。您能解释一下为什么要在运行时创建变量吗?你可以改用数组。
  • 我不知道我可以使用数组来代替。谢谢。我不喜欢在 stackoverflow 上提问。因为被否定,我觉得自己像个完全的菜鸟。
  • 试试javascript书。那里有很多。这是基本的东西,自学更快。如果您对编程很认真,请每天花半小时阅读一些内容。
  • 好教程:eloquentjavascript.net.

标签: javascript jquery variables dynamic


【解决方案1】:

你有两个选择:

  1. 使用数组:

    var unidades = [];
    $(e).find('unidadeid').each(function () {
        unidades.push($(this).text());
    });
    

    var unidades = $(e).find('unidadeid').map(function () {
        return $(this).text();
    }).get();
    
  2. 如果您真的非常想拥有不仅仅是数字的名称,请使用对象和括号表示法:

    var unidades = {}, countUnidades = 0;
    $(e).find('unidadeid').each(function () {
        countUnidades++
        unidades['Unidade' + countUnidades] = $(this).text();
    });
    

    这将创建一个对象unidades,它具有Unidade0Unidade1 等属性。请注意,each 接收一个索引,因此您不需要countUnidades,除非您需要它用于其他用途:

    var unidades = {};
    $(e).find('unidadeid').each(function (index) {
        unidades['Unidade' + index] = $(this).text();
    });
    

【讨论】:

  • 我确实想将 countUnidades 用于其他用途 :)
  • @ghaschel: :-) 好吧,那就这样吧。 :-) 在上面的#1 中,countUnidadesunidades.length。在#2 中,第一个示例有countUnidades
【解决方案2】:

你总是可以使用数组:

var Unidade = [],
    countUnidades = 0;

$(e).find("unidadeid").each(function(i) {
    Unidade[countUnidades++] = $(this).text();

    // ... or Unidade.push($(this).text());
    // ... or Unidade[i] = $(this).text();
});

不要忘记 DOM 元素应该始终具有唯一 ID,因此如果 unidadeid 引用某个元素的 ID,则此处不需要 each 迭代。

【讨论】:

    【解决方案3】:

    您的示例只是添加到我假设的具有增量值的数组中。 Unidade 在 JSON 中看起来像这样:

    [
        0: "text0",
        1: "text1",
        2: "text2"
    ]
    

    但是,如果您想将它添加到一个对象,您只需遍历一个字符串数组,其中该数组的长度与您的项目列表的长度相同。事实上,您可能希望将此值附加到数据属性,其中值是变量名称,文本是元素的内容。所以 HTML 应该是这样的:

    <div data-var="a">Text1</div>
    <div data-var="b">Text2</div>
    <div data-var="c">Text3</div>
    

    需要这个 JS:

    var unidade = {};
    
    $("div").find('unidadeid').each(function() {
        unidade[$(this).data('var')] = $(this).text();
    });
    
    console.log(unidade);
    

    对象看起来像这样:

    {
        "a": "Text1",
        "b": "Text2",
        "c": "Text3"
    }
    

    【讨论】:

      【解决方案4】:

      我怀疑您需要动态创建变量。这很少有帮助。

      您可能想了解数据结构;特别是我认为你只想要一个数组:

      var unidades = []; // declare the array outside the loop
      $(e).find('unidadeid').each(function () {
          countUnidades++;
          unidades[countUnidades] = $(this).text();
      });
      

      现在您有了一个数组,unidades,其值是您元素的 text() 内容。

      我不确定 find('unidadeid') 是否是您想要的 - 找到所有 &lt;unidadeid&gt; 元素,这不是 HTML 元素,但您可能正在处理自定义 XML,或者这只是一个示例。

      【讨论】:

        【解决方案5】:

        好吧,为了完整起见,这正是您所要求的,尽管这是一个糟糕的主意:

        $(e).find('unidadeid').each(function () {
          countUnidades++;
          var t = $(this).text();
          eval('Unidade' + countUnidades + ' = t;');
        });
        

        注意:

        • eval 很难在不打开安全漏洞的情况下使用。
        • eval 很慢。
        • 动态创建变量毫无意义,因为您还需要动态访问它们。
        • 变量是全局变量(否则它们将是回调函数的本地变量,并在创建后立即消失)。

        通常你会使用数组来代替:

        var Unidade = [];
        $(e).find('unidadeid').each(function () {
          Unidade.push($(this).text());
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-20
          • 2011-05-12
          • 1970-01-01
          • 2011-08-18
          • 1970-01-01
          • 2014-09-17
          • 1970-01-01
          • 2018-05-06
          相关资源
          最近更新 更多