嵌套 for 循环的最佳替代方案是什么?

What is the best alternative to nested for loops?

我正在尝试优化此代码,它会测量 space 中 2 个点的长度,并在长度合适时画一条线。问题是它非常慢(主要是在智能手机上)。 有什么我可以做的让它更快吗?比如避免一些不必要的代码。我已经尝试了几个星期。

   this.dots.forEach(p => {
      this.dots.forEach(q => {
        // Using  x * x instead of Math.pow for efficiency
        let z = Math.sqrt((q.x - p.x) * (q.x - p.x) + (q.y - p.y) * (q.y - p.y));

        if(p != q && z < this.STRING_MAX && z > this.STRING_MIN) {

         // Background's oposite color
          if(p.y > p5.windowHeight + 45) {
            p5.stroke(0, this.transp);
          } else {
            p5.stroke(255, this.transp);
          }
          p5.line(p.x, p.y, q.x, q.y);
        }
      });
    });

这是它的外观(它不仅画线,这也是它速度较慢的原因): Neural Fuse

Gitlab project

首先,数学函数可以在 if() 测试循环中完成,因为那样会忽略 p == q 项。

然而,对于这种情况,我建议更典型的是有两个循环——外循环从 0 到倒数第二项,内循环从外循环的计数器+1 到最后一项:

for (let i = 0; i < items.length - 1; i++) {
  for (let j = i + 1; j < items.length; j++) {
    // check values at i and j
  )
}

这样,i 和 j 永远不会相同,您也无需为 i 的每个实例遍历整个数组。