【问题标题】:javascript use var value as name for new varjavascript 使用 var 值作为新 var 的名称
【发布时间】:2014-03-12 18:40:45
【问题描述】:

如何使用数组键(文本值)来引用同名的变量?

jsFiddle

var cr,au,gen,bn,fmt,str;
var sbASCtrls = {"cr":"ContentRating","au":"Gold","gen":"Gender","bn":"Big Number","fmt":"Format","str":"Starting String"};

for (var key in sbASCtrls){

    //This does not work ... breaks script
    "'"+key+"'" = sbASCtrls[key];

    alert('var CR: ' + cr);
    return false;
}

在另一种语言中,我会简单地将 var 名称用百分号括起来,因此:

var %key% = "bob";

会做:

var cr = bob;

如何在 javascript 中做到这一点?


为什么我需要这种不同寻常的解决方案:

正在对预先存在的 PHP 处理器文件进行一系列 AJAX 调用,该文件需要 HTML 格式的所有数据。在这种情况下,我已经拥有 JSON/jsObj 格式的数据,并希望快速将其分解为单独的变量。使用eval() 实现了最高效/可读(信不信由你!)代码。在阅读了 Jonathan 和 Niet 的帖子/cmets 之后,我为如何将数据保留为 JSON 格式并像这样使用它而苦苦挣扎,但是 AJAX 处理器总是需要 HTML 格式的数据。令我失望的是,我无法找到混合这两种数据类型的方法。面对重新编码整个应用程序以仅使用 JSON 或继续使用 HTML 的选择,SDLC 为我做出了决定。

感谢 Niet、Jonathan、Cristy、Stephen Thomas 和 Fallenreaper 提供的中肯建议和好主意。我将确定你们各自发布的其他帖子的范围。

【问题讨论】:

  • 如果你真的想这样做,你必须使用eval(),否则 JavaScript 不支持动态标识符。但是,typical suggestion is to use an object instead,你已经拥有了。那么,为什么不把它作为一个对象来获取/设置你想要的属性呢?
  • 我不会这样做。即使您设法使其正常工作,但在公开发布某些内容时,缩小会使其更小更快地加载到页面上,因此无关紧要。

标签: javascript


【解决方案1】:

虽然您可以像这样使用eval

// DO NOT DO THIS
eval(key+" = svASCtrls[key];");

您应该先停下来问问自己为什么要这样做。你已经有了一个非常整洁的对象,所以就用它吧……

【讨论】:

  • Niet,我明白你为什么有 14 金币了。非常感谢您的帮助。请参阅我的问题的附录,它解释了为什么我需要这个不寻常的解决方案。就我而言,在阅读了许多关于 eval() 的注意事项后,我相信它是这些圈子中最好的解决方案。
【解决方案2】:

您可以将变量定义为对象的属性

var obj = { cr: null, au: null, gen: null, bn: null, fmt: null, str: null };
var sbASCtrls = {"cr":"ContentRating","au":"Gold","gen":"Gender","bn":"Big Number","fmt":"Format","str":"Starting String"};

for (var key in sbASCtrls){

    //This does not work ... breaks script
    obj[key] = sbASCtrls[key];

    alert('var CR: ' + obj.cr);
    return false;
}

【讨论】:

  • 这不就是……克隆对象吗?
  • 是的。还不如删了
  • 谢谢你的想法,斯蒂芬。尽管您的回答没有直接解决我提出的问题,但您的解决方案确实奏效了 - 有一段时间,您的解决方案看起来将是 最佳 方法。 +1
【解决方案3】:

由于任何全局变量都是window 对象的子对象,您可以在window[key] 处创建变量

for (var key in sbASCtrls){
    alert("key: " + key);
    alert("val: " + sbASCtrls[key] );

    //This should work, but jsfiddle messes with the window object
    window[key] = sbASCtrls[key];


    alert('var CR: ' + cr);
    return false;
}

请注意,这不适用于jsfiddle,但应该适用于您的网站。

【讨论】:

  • 这假定它们是全局的。而且,他们可能是。但是,您可能想强调这种依赖性。
  • 虽然我选择 Niet 的 eval() 作为我问题的最佳答案,但这是一个很好的答案!它奏效了。它回答了我提出的问题。 +1 很好的解决方案,但不大于您回答的 this other amazing post - 另一个 +1。
猜你喜欢
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多