javascript虽然循环正确迭代,但对于具有相同逻辑的循环,在具有整数值和一些空值的数组中不是
迭代一个javascript数组,该数组中有一些数据,还有一些javascript虽然循环正确迭代,但对于具有相同逻辑的循环,在具有整数值和一些空值的数组中不是,javascript,c#,jquery,asp.net,arrays,Javascript,C#,Jquery,Asp.net,Arrays,迭代一个javascript数组,该数组中有一些数据,还有一些null或未定义的值,这会给for循环带来有趣的行为,但不会给while循环带来有趣的行为。它没有在应该返回的时候返回,并且卡在一个无限循环中 我已经对输出进行了广泛的调查,数组中是否存在数字的条件从未被评估为true,只有false,但有时它会进入if语句区域,就好像它是true一样。这似乎是武断的 //function called within this code function randomArrayOfIndexes()
null
或未定义的值,这会给for循环带来有趣的行为,但不会给while循环带来有趣的行为。它没有在应该返回的时候返回,并且卡在一个无限循环中
我已经对输出进行了广泛的调查,数组中是否存在数字的条件从未被评估为true
,只有false
,但有时它会进入if语句区域,就好像它是true一样。这似乎是武断的
//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;
}
//在此代码中调用的函数
函数randomArrayOfIndexes(){
var randNumbArray=新数组(4);
var indextoasign=Math.floor(Math.random()*Math.floor(4));
randNumbArray[0]=IndexToAsign;
对于(i=1;i
首先,上面的每个函数在一个带有[int value,null,null,null]和一个随机数的数组中传递;当函数返回时,下一个空值将填充其中不存在的随机数,因此[int-value,int-value,null,null]。。。直到所有值都被填充。。。最后一个数组由从0到3的唯一随机数填充,以便为另一个数组中的一段数据提供索引。。。确保在我编写的程序中只使用一次
如果传入的数字已经存在,我希望它返回true,然后在断开的函数外生成另一个随机数,并重复该过程,直到找到唯一的随机数。找到后,将在下一个可用索引处填充要传回的数组,并重复该过程。这并没有发生。它陷入了一个无限循环,再也没有返回,你只是在i
之前缺少了一个var
:
function arrayIncludes(arrayin, numberIn) {
for (var i = 0; i < arrayin.length; i++) {
// in ^ here
if (arrayin[i] === numberIn) {
return true;
}
}
return false;
}
函数arrayIncludes(arrayin,numberIn){
对于(变量i=0;i
您也可以在循环之前声明它,如
var i;
for (i = 0; i < arrayin.length; i++) {
...
vari;
对于(i=0;i
顺便说一句,这种生成无重复随机数的方法效率非常低,我建议使用0-3数组(在您当前的示例中)或者0-n,然后从中随机抽取项目。这样,您就不必每次找到新的数字时都遍历整个数组。每次您只需找到0和剩余项目长度之间的随机索引
假设数组长度为1000,剩下的最后一项是一个类似于100的数字,您需要找到一个随机数并在整个数组中循环多少次,直到您的随机数为100
var n=5;
var a=新数组(n);
对于(var i=0;i您需要使用i=0的声明循环中的变量。如果不这样做,则该变量是全局变量,并且当您在嵌套循环中使用相同的循环变量时,一个可以更改另一个
您在两个循环中都使用了i
,因此当您调用for
循环时:
function arrayIncludes(arrayin, numberIn) {
for (i = 0; i < arrayin.length; i++) {
// etc
}
请阅读我答案下面的描述。我希望它能有所帮助。我以前使用过它,使我的算法速度提高了数千倍。我还为它添加了代码。我认为它不会像变量范围那样简单(更多的是数组在运行时的行为)所以我从来没有想过尝试。谢谢你的建议谢谢你的投入,这更好地帮助我理解了问题和解决方案的逻辑。