首页 > 解决方案 > 代码在一系列 for 循环中卡住了,我不知道为什么

问题描述

编辑 - 我更改了代码以正确声明下面的变量,但似乎没有任何改变

我使用 for 循环编写了代码,在执行其中的内容之前必须满足许多条件。问题是,在此过程中的某个地方,代码卡在其中一个循环中,导致计算机崩溃。

我试过打破循环,但这似乎没有帮助。

function compareKeypoints(varifiedKeypoints) {

  outer_loop: for (i = 0; i < varifiedKeypoints.length; i++) {

    let initialKeypoint = varifiedKeypoints[i];

    for (j = 0; j < varifiedKeypoints.length; j++) {

      let comparisonKeypoint = varifiedKeypoints[j];

      if (initialKeypoint.part != comparisonKeypoint.part) {

        if (Math.abs(comparisonKeypoint.position.x - initialKeypoint.position.x) <= 20
        && Math.abs(comparisonKeypoint.position.y - initialKeypoint.position.y) <= 20) {

          if (keypointsCompatible(initialKeypoint.part, comparisonKeypoint.part)) {

            console.log("Activating part: " + initialKeypoint.part);
            console.log("Activated part: " + comparisonKeypoint.part);

            let keypointPair = {
              point_1: initialKeypoint.part,
              point_2: comparisonKeypoint.part
            }

            console.log("Pushing parts!");
            activeParts.push(keypointPair);

            console.log("breaking loop!");
            break outer_loop;

            console.log("Loop NOT broken!!");

          }
        }
      }
    }
  }

  if (activeParts.length > 0) {
    console.log(activeParts);
  }
}

function keypointsCompatible(keypoint_1, keypoint_2) {

  var outcome = true;

  if (activeParts.length > 0) {

    compatibility_loop: for (i = 0; i < activeParts.length; i++) {

      if (Object.values(activeParts[i]).includes(keypoint_1) && Object.values(activeParts[i]).includes(keypoint_2)) {

        console.log(keypoint_1 + " and " + keypoint_2 + " are not compatible because they already exist as " + activeParts[i].point_1 + " and " + activeParts[i].point_2 + " respectively");

        outcome = false;

        break compatibility_loop;

        console.log("Compatibility NOT broken!!");
      }
    }
  }

  console.log("Compatibility outcome is " + outcome);
  return outcome;
}

该代码假设在同一个数组中取两个值并比较它们。如果满足多个条件,包括彼此相距一定距离,它们将被推入二级阵列。如果这些值已经出现在辅助数组中,而 keypointCompatible 函数应该确定该值,则循环应该继续寻找其他候选者,或者在再次调用之前停止。然而,由于某种原因,当代码检测到值已经出现在辅助数组中时,代码会卡在 keypointCompatible 函数中,并且控制台将重复打印“兼容性为假”,直到浏览器崩溃。

标签: javascriptfor-loop

解决方案


工作解决方案

使用letconst代替var或不使用。您的问题可能与循环之间重用的闭包和变量有关。确保你也使用letconst在你的循环中。for (let i=0).

当您使用letorconst时,运行时将在每次块或循环迭代时创建一个新实例。但是,使用var将重用内部分配。

因此,标准发生的情况var是多个闭包或循环每个都使用相同的变量实例。

除非您想要这种var行为,否则请始终使用letor const


另一种解决方案

在标签后添加换行符compatibility_loop

又一个解决方案

第一个功能是推入activeParts. 第二个功能是循环activeParts。这可以永远持续下去,或者比预期的更长。推入数组可能会使循环限制永远不会达到。在第二个函数的长度上放一个日志,activeParts看看它是否越来越失控。


推荐阅读