javascript while循环正确迭代但具有相同逻辑的for循环不是,在具有整数值和一些空值的数组上

Posted

技术标签:

【中文标题】javascript while循环正确迭代但具有相同逻辑的for循环不是,在具有整数值和一些空值的数组上【英文标题】:javascript while loop correctly iterating but for loop with same logic is not, on array with integer values and some null values in there 【发布时间】:2019-08-14 22:33:09 【问题描述】:

遍历包含一些数据的 javascript 数组,以及一些 nullnot defined 值,在 for 循环中给出了有趣的行为,但在 while 循环中没有。它没有在应该返回的时候返回并且卡在无限循环中

我已经广泛调查了输出,数组中是否存在数字的条件从未被评估为true,只有false,但它有时会进入 if 语句区域,就好像它是真的一样。这似乎是任意的。

//function called within this code

function randomArrayOfIndexes() 
    var randNumbArray = new Array(4);
    var indexToAssign = Math.floor(Math.random() * Math.floor(4));
    randNumbArray[0] = indexToAssign;


for (i = 1; i < randNumbArray.length; i++) 
    indexToAssign = Math.floor(Math.random() * Math.floor(4));
    while (arrayContains(randNumbArray, indexToAssign)) 
        indexToAssign = Math.floor(Math.random() * Math.floor(4));
    
    randNumbArray[i] = indexToAssign;


return randNumbArray;


//this works

function arrayContains(arrayin, numberIn) 
    var i = arrayin.length;
    while (i--)  //takes one from i so highest index is accurate on first iteration
        if (arrayin[i] === numberIn) 
            return true;
        
    
    return false;


//this doesn't... not even backwards like the above iteration

function arrayIncludes(arrayin, numberIn) 
    for (i = 0; i < arrayin.length; i++) 
        if (arrayin[i] === numberIn) 
            return true;
        
    
    return false;


首先上面的每个函数都传入一个数组,里面有[int value, null, null, null],还有一个随机数;当函数返回时,下一个空值被填充其中不存在的随机数,所以 [int value, int value, null, null]...直到所有值都被填充...最终数组填充了从 0 到 3 的唯一随机数,为另一个数组中的一段数据提供索引...以确保它在我正在编写的程序中只使用一次。

如果传入的数字已经存在,我希望它返回 true,然后在损坏的函数之外生成另一个随机数,并重复该过程直到找到唯一的随机数。找到后,传回的数组将在下一个可用索引处填充,并重复该过程。这没有发生。它陷入了无限循环,永远不会返回

【问题讨论】:

请阅读我的回答下方的描述。我希望它有所帮助。我以前用过它,使我的算法快了数千倍。 我也添加了代码 【参考方案1】:

您只是在i 之前缺少一个var

function arrayIncludes(arrayin, numberIn) 
    for (var i = 0; i < arrayin.length; i++) 
//     in ^ here
        if (arrayin[i] === numberIn) 
            return true;
        
    
    return false;


你也可以在循环之前声明它,比如

var i;
for (i = 0; i < arrayin.length; i++) 
...

顺便说一句,这种生成没有重复的随机数的方法效率很低,我建议使用 0-3(在您当前的示例中)或 0-n 的数组,然后随机从中取出项目。那么您不必每次找到一个新数字时都遍历整个数组。每次你只找到一个介于 0 和剩余项目长度之间的随机索引。

假设数组长度为 1000,剩下的最后一项是 100 之类的数字,你必须找到一个随机数并循环整个数组直到你的随机数为 100 多少次?

var n = 5;
var a = new Array(n);
for(var i=0;i<n;i++) a[i] = i;
var result = new Array(n);
var i = n;
while(i)

    var index = Math.floor(Math.random() * i);
    result[--i] = a[index];
    a.splice(index,1);


document.getElementById('a').innerhtml = result;
&lt;div id="a"&gt;&lt;/div&gt;

【讨论】:

太棒了,我不认为它会像变量范围那样简单(更多的是运行时数组的行为),所以我从没想过尝试。感谢您的提醒【参考方案2】:

您需要在循环中使用for i=0 声明变量。如果你不这样做,变量是全局的,当你在嵌套循环中使用相同的循环变量时,一个可以改变另一个。

您在两个循环中都使用i,所以当您调用for 循环时:

function arrayIncludes(arrayin, numberIn) 
    for (i = 0; i < arrayin.length; i++) 
 // etc 
 

您将 i 设置回 0 并对其进行迭代 - 这是您在 randomArrayOfIndexes 中使用的相同 i,因此它会干扰该循环。这是难以发现错误的常见原因,因此您应该始终声明循环变量。

这是最简单形式的错误。请注意,out 循环只运行一次,因为i 在内部循环中递增,导致 outloop 提前退出:

for (i = 0; i < 4; i++)
    console.log("out loop number: ", i)
    for (i = 0; i < 4; i++)
        console.log("inner_loop: ", i)
    

如果您为for let i = 声明变量,每个循环都会获得自己的i 版本,两个循环独立运行:

for (let i = 0; i < 4; i++)
    console.log("out loop number: ", i)
    for (let i = 0; i < 4; i++)
        console.log("inner_loop: ", i)
    

【讨论】:

感谢您的输入,这更好地帮助我理解了解决方案的问题和逻辑。

以上是关于javascript while循环正确迭代但具有相同逻辑的for循环不是,在具有整数值和一些空值的数组上的主要内容,如果未能解决你的问题,请参考以下文章

Javascript,while循环返回

while循环如何迭代?

while do while以及穷举和迭代

每次while/for循环迭代后如何等待一秒钟?

JavaScript day03 循环

Python入门教程第57篇 循环进阶之模拟do…while语句