以下是我想要干扰的JavaScript代码片段:
if(agency == 'abcd')map.entities.push(abcd);
if(agency == 'efgh')map.entities.push(efgh);
if(agency == 'xyz')map.entities.push(xyz);
if(agency == 'pqrs') map.entities.push(pqrs);
if(agency == 'values')map.entities.push(values);
现在将来可能会有更多不同密钥的ifs.JavaScript不提供HashMap的构建,我可以在这里使用。使用数组和id的东西使它干得太俗气了。 有更简单的解决方案吗?可能是这样的
if(agency == 'abcd')map.entities.push(stringToVariable('abcd'));
然后我可以使用for和迭代键。我不确定这在JavaScript中是否可行。
答案 0 :(得分:11)
好吧:
map.entities.push({abcd: abcd, efgh: efgh, xyz: xyz}[agency]);
对我来说,这是一种需要退后一步并重新考虑更多情况的情况,因为它本身就是丑陋的。为什么存在所有这些单独的变量,而不是具有与“代理”值对应的键的单个对象?
答案 1 :(得分:2)
只要您知道eval
值是干净的,就可以使用agency
这是合法的案例:
map.entities.push(eval(agency));
答案 2 :(得分:1)
javascript中的每个对象都是一个hashmap(至少是一种hashmap),这就是为什么这段代码返回true:
var obj = {};
obj.test = "someVarVal";
obj.test === obj['test'];
所以,你可以做的是建立一个returnvalues / functions的对象,如下所示:
var returns = {};
returns['abcd'] = function() {return 'abcd';};
returns['efgh'] = function() {return 'efgh';};
然后再做
map.entities.push(returns[agency]());
如果你的所有变量都是静态的,你可以做得更简单,如下:
var returns = {};
returns['abcd'] = 'abcd';
map.entities.push(returns[agency]);
答案 3 :(得分:1)
var agency='foo',
wanted_words=new Regexp(/^abcd|efgh|xyz|pqrs|values$/);
agency.match(wanted_words) && map.entities.push(eval(agency));
假设代理的所有可能值都作为变量存在。
答案 4 :(得分:1)
function _inArr(arr,itm)
{
for (var i=0; i < arr.length; i++)
{
if (arr[i] == itm) return true;
}
return false;
}
var allowedAgencies = array['abcd','efgh','xyz','pqrs','values'];
if (_inArr(allowedAgencies, agency))
{
map.entities.push(window[agency]);
}
_inArr函数可用于每个主要的javascript包(例如$ .inArray)。
我认为关键是JavaScript是一个很大的hashmap。例如,全局函数名称只是窗口对象的一个键。任何命名空间的项目都是如此。