Javascript随机数组检查错误

时间:2015-07-23 13:06:00

标签: javascript arrays

在游戏中工作,无法弄清楚为什么我的功能无法正常工作..

  

未捕获RangeError:超出最大调用堆栈大小

据我所知,我的一个函数有一个无限循环(?)

我有一个数组女巫需要有3个随机速度。

var randomSpeeds = new Array();

我有一个功能,巫婆产生一个随机的速度:

function generateSpeed() {
    var randomSpeed = Math.random().toFixed(1) * 5;
    if(randomSpeed == 0){
        randomSpeed = 1;
    }
    return randomSpeed;
}

该数组由此函数填充:

function fillSpeedArray() {
    for(var i = 0; i < 3; i++) {
        var randomSpeed = generateSpeed();
        if(speedArrayChecker(randomSpeed) != false) {
            randomSpeeds.splice(i, 0, randomSpeed);
        } else {
            fillSpeedArray();
        }
    }   
}

该函数循环3次,每次产生随机速度,并通过if / else语句检查数组是否已经获得随机生成的数字(speedArrayChecker)。

speedArrayChecker:

function speedArrayChecker(speed) {
    for(speeds in randomSpeeds) {
        if(speeds != speed) {
            return true;
        }
    }
    return false;
}

这最后一个函数通过数组,如果数组已经是随机生成的数字,则返回true,否则返回false。

调用和检查函数:

fillSpeedArray();
console.log(randomSpeeds);

由于某种原因,我发现功能无法正常工作。 谢谢和问候。

2 个答案:

答案 0 :(得分:1)

这里有一个无限循环(通过递归):

function fillSpeedArray() {
 for(var i = 0; i < 3; i++) {
        var randomSpeed = generateSpeed();
        if(speedArrayChecker(randomSpeed) != false) {
            randomSpeeds.splice(i, 0, randomSpeed);
        } else {
            fillSpeedArray();
        }
    }   
}

else中,如果速度已经存在,它将一次又一次地调用它当前所处的功能。除非你第一次完美地获得3个随机速度,否则此功能永远不会退出。我建议将fillSpeedArray()更改为i--

另外,请注意为什么不使用randomSpeeds.push(randomSpeed)为阵列添加速度。

答案 1 :(得分:1)

<强>解决方案:

var randomSpeeds = new Array();
function generateSpeed() {
    var randomSpeed = Math.random().toFixed(1) * 5;
    if(randomSpeed == 0){
        randomSpeed = 1;
    }
    return randomSpeed;
}
function fillSpeedArray() {   
    while (randomSpeeds.length < 3) {
        var randomSpeed = generateSpeed(); 
        if (speedArrayChecker(randomSpeed) != false) {
            randomSpeeds.splice(randomSpeeds.length, 0, randomSpeed);
        }
    }
}
function speedArrayChecker(speed) {
    return randomSpeeds.indexOf(speed) === -1
}
fillSpeedArray();
console.log(randomSpeeds);

<强>解释

您的代码存在两个问题。

  1. speedArrayChecker功能的实施存在根本缺陷。当false为空时,它仅返回randomSpeeds
  2. 由于无限递归而导致无限循环。
  3. 解决方案是更正speedArrayChecker实现并使用while循环而不是for循环。