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 数组,以及一些 null
或 not 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;
<div id="a"></div>
【讨论】:
太棒了,我不认为它会像变量范围那样简单(更多的是运行时数组的行为),所以我从没想过尝试。感谢您的提醒【参考方案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循环不是,在具有整数值和一些空值的数组上的主要内容,如果未能解决你的问题,请参考以下文章