使用Javascript在forEach中进行切换是不好的做法吗?

时间:2015-02-26 04:17:53

标签: javascript foreach switch-statement

使用Javascript在forEach中进行切换是不好的做法吗?

book.forEach(function (getBook, i) {
  switch (getBook) {
  case path:
    string = 'some html';
    break;
  };
});

我的理解是这会为getBook的每个实例创建一个开关。让我们说有100个。然后我有100个单独的开关。那不好吗?

最重要的是,有没有人有更好的方法来做到这一点?似乎只有一个开关而不是整个开关会更好。

2 个答案:

答案 0 :(得分:3)

在此示例中,调整当前代码,您可以执行类似 -

之类的操作
bookActions = {}; 

bookActions['path'] = function() { // or the real way you're loading these
    // other code to generate that you would have had in 
    // the switch case
    return 'some html'; 
}; 

然后,一旦你有100个左右的案件,你可以

book.forEach(function(getBook, i) { 
    if (bookActions[getBook]) { 
        string = bookActions[getBook](); 
    }
}); 

通过这种方式,我使用文字对象作为字符串(代码中的getBook)和函数(开关案例的主体)之间的映射。

答案 1 :(得分:3)

除非开关很长,比如超过5-10个情况,否则可以像你的例子那样做。 JavaScript在单个线程中运行这样的例程,因此没有更高级的功能技术的胜利。纯粹是为了代码维护,如果你有十几个案例,那么使用一组函数并将它们映射到一个对象是有意义的。实际上,许多JavaScript模式都是基于这种技术构建的,主要用于各种路由器。例如,请查看Backbone router。请注意,您如何甚至可以将案例鉴别器(路径路径)构思化。

调用这样的路线很容易(近似的想法,因为问题中的代码不完整):

if (routes[book.path]) routes[book.path].apply(self, args)

但是,如果您想使用路由模板,则需要迭代所有映射,如下所示:

for (route in routes)  {
  if (matches(route,book.path)) routes[route].apply(self, args)
}