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

Is it bad practice to have a switch within forEach with Javascript?

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

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

我的理解是,这将为每个 getBook 实例创建一个开关。假设有 100 个。然后我有 100 个独立的开关。不好吗?

最重要的是,有没有人有更好的方法来做到这一点?似乎只有一个开关比一大堆开关更好。

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

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)和函数(切换案例的主体)之间的映射。

除非开关很长,比方说,超过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)
}