【问题标题】:JS: For loop continues to iterate after condition is falseJS:条件为假后for循环继续迭代
【发布时间】:2017-01-30 23:14:40
【问题描述】:

有谁知道在满足条件后什么会导致我的 for 循环继续?我会发布整个文件,但它非常大。以下是循环:

for (var j = 0; j < depKeyArr.length; j++) {
    var directory = angular.copy(dependencies[depKeyArr[j]]),
        keyArr = angular.copy(Object.keys(directory));
    for (var i = 0; i < keyArr.length; i++) {
        var next = i + 1;       

        if (keyArr[i] && !keyArr[i].includes('Params')) {
            if (keyArr[next] && keyArr[next].includes('Params')) {
                directory[keyArr[next]] = directory[keyArr[next]].split(', ') !== [''] ? directory[keyArr[next]].split(', ') : undefined
                directory[keyArr[next]].push(directory[keyArr[i]])
            }
            var paramArr = directory[keyArr[next]] ? directory[keyArr[next]] : directory[keyArr[i]]
            switch (depKeyArr[j]) {
                case 'controller':
                    angular.module('app').controller(keyArr[i], paramArr)
                    break
                case 'directive':
                    angular.module('app').directive(keyArr[i], paramArr)
                    break
                case 'factory':
                    angular.module('app').factory(keyArr[i], paramArr)
                    break
                case 'filter':
                    angular.module('app').filter(keyArr[i], paramArr)
                    break
                case 'service':
                    angular.module('app').service(keyArr[i], paramArr)
                    break

            }
        }
    }
}

所以depKeyArr.length 在这个特定实例中等于 5,keyArr.length 等于 42。当满足这些条件时,两个 for 循环都会继续执行,尽管我希望它们在 4 和 41 处停止. 您可以提供的任何帮助,以便我弄清楚为什么会很棒。

上面更新了片段!

另外 - 你们都提到 i & j 改变了,但是当我在调试器中查看它时,它们没有改变。我现在正在查看它 - j = 5 和 depKeyArr.length 是 5。类似地,i = 42 和 keyArr.length 是 42......但我在两个循环中,特别是在 switch 语句中的最后一种情况.当 keyArr[i] 未定义时失败。

针对 OBDM 提供的答案,我添加了angular.copy() 以防止从循环内部更新数组。当满足布尔条件时,它仍在进入循环。更令人困惑的是,即使if 条件也不能阻止它执行切换。应该无法输入以下if

if (!keyArr[i].includes('Params'))

因为到那时keyArr[i] 是未定义的。

最新更新 -

似乎我已经通过最新的更改成功地打破了内部循环,但它仍然继续到 switch 语句并在keyArr[i] 上中断,即使该开关在两个循环内和一个评估的if 条件为假。

【问题讨论】:

  • 如果内循环继续迭代,你怎么知道外循环也在迭代呢?关于你的外循环,j 不会永远超过 0 吗?
  • 您确定ijfor 之外没有变化吗?
  • @JoaozitoPolo 我对此进行了研究,但我想我需要一个条件,因为我只想在超过条件时跳出循环......但是这个错误忽略了其中的条件循环,它只是直接回到最后一个 switch 语句。这是最奇怪的事情......

标签: javascript angularjs for-loop conditional-statements


【解决方案1】:

一般来说,使用“动态值”设置循环的停止条件是一种不好的做法,即可以在迭代循环时更改的值。

以下代码生成一个无限循环:

for (var j = 0; j < depKeyArr.length; j++) {
   depKeyArr.push("whatever");
}

而不是在变量中设置停止条件来防止不明确的行为:

var depKeyArrLen = depKeyArr.length;

for (var j = 0; j < depKeyArrLen; j++) {
   depKeyArr.push("whatever");
}

【讨论】:

  • 至于您关于在变量中设置长度的最新观点,我以前从未这样做过。我更倾向于按值复制数组,以便它循环的数组是静态的。
【解决方案2】:

“有谁知道什么会导致我的 for 循环在满足条件后继续?我会发布整个文件,但它非常大。这是循环:”

我不确定“//blah blah more code”是什么,但在这里您需要确保在该部分中没有涉及变量 i 和 j 的值更改的操作,因为通常我们会执行 i 的序列循环, j, k, l 等等,如果你在那个 bla bla more 代码中有另一个循环并且不自觉地把 j 因为在 i 之后,你知道后来发生了什么......

【讨论】:

  • 你能再解释一下吗? “无意识地放了j,因为在i之后,你知道后来发生了什么……” 里面没有循环,但是有一个开关。我不是故意更新ij,但我会寻找的。​​span>
  • 那是什么开关?它也会更新 i 或 j 吗?
【解决方案3】:

对于任何可能遇到类似情况的人来说,这只是程序未能在循环中附加最终角度服务时发生的奇怪行为。

我一遍又一遍地重复它,最后不得不退后一步,质疑这些假设。我假设循环成功完成,但他们没有。这就是答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2021-08-02
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多