最优雅的方式使这个JavaScript代码干

时间:2011-05-17 23:59:53

标签: javascript dry

以下是我想要干扰的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中是否可行。

5 个答案:

答案 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。例如,全局函数名称只是窗口对象的一个​​键。任何命名空间的项目都是如此。