Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从代码中删除警报将强制它进入无限循环_Javascript_Arrays_Sorting_Object_Alert - Fatal编程技术网

Javascript 从代码中删除警报将强制它进入无限循环

Javascript 从代码中删除警报将强制它进入无限循环,javascript,arrays,sorting,object,alert,Javascript,Arrays,Sorting,Object,Alert,我有一段代码,其中包含一些窗口警报消息。它很好用。但是,如果我删除alert语句,程序将进入无限循环。这对我来说很奇怪 有人能帮我找出代码的问题吗 function countSwaps(arr) { let notVisited = {}, swaps = 0; for (let i = 0; i < arr.length; i++) { notVisited[i] = true; } while (Object.keys(notVis

我有一段代码,其中包含一些窗口警报消息。它很好用。但是,如果我删除alert语句,程序将进入无限循环。这对我来说很奇怪

有人能帮我找出代码的问题吗

function countSwaps(arr) {

    let notVisited = {}, swaps = 0;
    for (let i = 0; i < arr.length; i++) {
        notVisited[i] = true;
    }

    while (Object.keys(notVisited).length) {
        alert("main pass");
        let nextPos, currentPos = Object.keys(notVisited)[0];
        while (arr[currentPos] !== parseInt(currentPos+1)) {
            nextPos = arr[currentPos] - 1;
            [arr[currentPos], arr[nextPos]] = [arr[nextPos], arr[currentPos]];

            swaps+= 1;
            alert("Swap " + arr[currentPos] + " and " + arr[nextPos] + "\n");
            delete notVisited[nextPos];
        }
        delete notVisited[currentPos];
    }
    return swaps;
}
console.log(countSwaps([2,3,4,1,5]));
功能计数交换(arr){
让notVisited={},swaps=0;
for(设i=0;i
这是无限循环的原因

while (Object.keys(notVisited).length) 
应该是这样的

while (Object.keys(notVisited).length > 0)

这是一个属性,它将始终返回true

好吧,它在没有警报的情况下为我运行无限循环

问题似乎是以下表达式:
parseInt(currentPos+1)

加法发生在从字符串转换为数字之前,例如:

currentPos = '4';
currentPos + 1 == '41';
parseInt(currentPos + 1) == 41
您需要的可能是
parseInt(currentPos)+1
。现在:

currentPos = '4';
parseInt(currentPos) + 1 == 5

这样,循环似乎退出了,我从中得到了3次交换的结果。

即使存在警报,内部循环也在循环。注意:切勿使用
alert
进行调试。它改变了代码的计时。使用调试器和/或
控制台.log