Javascript 随机数组检查错误
2015-07-23
53
正在开发一款游戏,但搞不清楚为什么我的函数无法正常工作。
Uncaught RangeError: Maximum call stack size exceeded
据我所知,我的一个函数有一个无限循环(?)
我有一个数组,里面需要有 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个回答
解决方案:
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);
解释:
您的代码有两个问题。
-
speedArrayChecker
函数的实现存在根本缺陷。它仅在randomSpeeds
为空时才返回false
。 - 您遇到了由无限递归导致的无限循环。
解决方案是更正
speedArrayChecker
实现并使用
while
循环而不是
for
循环。
Alex Booker
2015-07-23
这里有一个无限循环(通过递归):
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)
将速度添加到数组中呢?
depperm
2015-07-23