JS:For循环继续迭代条件为false

时间:2016-09-22 11:38:36

标签: javascript angularjs for-loop conditional-statements

有没有人知道在满足条件后会导致我的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&amp; 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]上中断,即使该开关位于两个循环内且{{1} } conditional,其值为false。

3 个答案:

答案 0 :(得分:1)

总的来说,用一个&#34;动态值来设置循环的停止条件是不好的做法。即迭代循环时可以改变的值。

以下代码生成无限循环:

BaseSetAssoc::BlkType

而不是在变量中设置停止条件,以防止出现不明行为:

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

答案 1 :(得分:0)

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

我不确定“//等等更多代码”,但是在这里你需要确保在那部分没有涉及变量i和j的值变化的操作,因为通常我们做一个i的序列循环,j,k,l等等,如果你有另外一个循环,那么bla bla更多的代码并且无意识地放j,因为在我之后,你知道后来发生了什么......

答案 2 :(得分:0)

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

我把它翻过来,最后不得不退后一步,质疑这些假设。我假设循环成功完成,但他们没有。答案就是这样。