javascript - 代码在一系列 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 函数中,并且控制台将重复打印“兼容性为假”,直到浏览器崩溃。
解决方案
工作解决方案
使用let
或const
代替var
或不使用。您的问题可能与循环之间重用的闭包和变量有关。确保你也使用let
或const
在你的循环中。for (let i=0)
.
当您使用let
orconst
时,运行时将在每次块或循环迭代时创建一个新实例。但是,使用var
将重用内部分配。
因此,标准发生的情况var
是多个闭包或循环每个都使用相同的变量实例。
除非您想要这种var
行为,否则请始终使用let
or const
。
另一种解决方案
在标签后添加换行符compatibility_loop
又一个解决方案
第一个功能是推入activeParts
. 第二个功能是循环activeParts
。这可以永远持续下去,或者比预期的更长。推入数组可能会使循环限制永远不会达到。在第二个函数的长度上放一个日志,activeParts
看看它是否越来越失控。
推荐阅读
- angular - Angular 中无法访问 Set-Cookie 和自定义标头?
- bash - 如何在 Nextflow 中调用脚本中创建的变量?
- javascript - 如何使用 javascript 创建两个按钮弹出窗口,用户可以在其中输入他们的名字?
- asp.net - 不断收到 SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“电影”中插入标识列的显式值
- python - TyperError python API 机器人
- r - LPA - 基于 BIC 的模型选择,具有函数prior=priorControl()
- docker - 通过 SSH 运行 docker 时出现“输入设备不是 TTY”错误
- go - 导入本地包的最佳方法是什么?
- codenameone - 隐藏的推送通知在 Android 上不起作用
- networking - 在 Fedora 中使用 nmcli 设置网络设备优先级