Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.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_C#_Jquery_Asp.net_Arrays - Fatal编程技术网

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()

迭代一个javascript数组,该数组中有一些数据,还有一些
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 
 }

请阅读我答案下面的描述。我希望它能有所帮助。我以前使用过它,使我的算法速度提高了数千倍。我还为它添加了代码。我认为它不会像变量范围那样简单(更多的是数组在运行时的行为)所以我从来没有想过尝试。谢谢你的建议谢谢你的投入,这更好地帮助我理解了问题和解决方案的逻辑。