【问题标题】:How can I optimize a for-loop over a list of specific conditions?如何在特定条件列表上优化 for 循环?
【发布时间】:2017-03-20 04:54:41
【问题描述】:

我在 JavaScript 中有一个 for 循环,迭代变量 i。在每个迭代步骤中,都会检查 if 条件列表。对于每个 i,这些条件中只有一个可以为真(或都不为真),并且每个条件都只对一个 i 为真。一个非常简单的例子是:

for (i = 1; i <= 10; i++)
{
if (i === 3) {some code ...}
if (i === 7) {some other code ...}
 }

显然,对于 4

(当然上面的例子意义不大,实际用例要复杂得多。)

提前感谢您的帮助!

【问题讨论】:

  • 将 3,7 存储在一个数组中。用于该数组。然后在里面切换案例。
  • 这可能会减慢速度。
  • 你有多少条件?看起来你有直接的相等条件,所以如果只有两个或三个这样的条件,那么直接访问第三个元素、第七个元素等等而不是循环列表不是更好吗?
  • 如果项是互斥的,实在是没办法提速了。任何复杂性都会使代码变慢。
  • @meyer9 - else if 会有所帮助:p

标签: javascript loops variables for-loop optimization


【解决方案1】:

Switch 更适合您想要实现的目标

for (i = 1; i <= 10; i++)
{
 switch(i){
  case 1:
   some code..;
   break; //once this is called, the statement will stop
  case 3:
   some other code..;
   break;
 }
}

【讨论】:

  • 请注意,在 Safari 9 中,switch 比 if/else 或 lookup table 慢 20 倍
  • 不使用 switch 的 break 怎么办? (更准确地说,我应该使用 continue 语句)w3schools.com/js/js_break.asp
  • 带有multiple cases 的Switch 语句也可以与循环本身内的continue 语句一起使用。
【解决方案2】:

一旦找到一个条件,您可以使用 else if 语句跳过所有其他条件。

for (i = 1; i <= 10; i++) {
    if (i === 3) {some code ...}
    else if (i === 7) {some other code ...}
}

在这种情况下,如果 i 为 3,则将跳过其他条件。

【讨论】:

  • 所以对于 i === 3 其他条件将被跳过。但是,对于 i === 4,将不必要地再次检查第一个条件(我已经知道,如果对于一些较小的 i 已经为真,则该条件对于另一个 i 不能为真)。这是我的问题。
  • 那么,项目是互斥的?
  • 是的,情况就是这样:对于每个 i,最多有一个条件为真。反之亦然:每个条件都只对一个 i 为真。
  • 没有办法有效地优化它。 Javascript 是一种相当高级的语言,因此任何像尝试检查之前是否比较过值之类的操作都会显着增加代码的时间。
  • 你是对的。我的代码很好,但措辞有误,谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2022-11-03
  • 2010-11-15
  • 1970-01-01
  • 2019-11-10
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多