2015-07-23 4 views
0

Работа над игрой и не могу понять, почему мои функции не работают правильно ..Javascript массив случайных ошибок проверки

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 раза, и каждый раз, когда он генерирует случайную скорость и goos через инструкцию if/else для проверки того, получил ли массив уже произвольно сгенерированное число (speedArrayChecker).

speedArrayChecker:

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

Эта последняя функция Goos через массив и, если массив уже идет случайное сгенерированное число, возвращает истину еще ложь.

Функция называется и проверено:

fillSpeedArray(); 
console.log(randomSpeeds); 

По причине я не вижу функция не работает правильно. Спасибо и приветствую.

ответ

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. У вас был бесконечный цикл, вызванный бесконечной рекурсией.

Решение было исправить speedArrayChecker реализацию и использовать while петлю вместо for петли.

+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), чтобы добавить скорости в массив.

+0

Просто педантичный: бесконечный _recursion_, а не бесконечный цикл. –

+0

Первая итерация должна быть гарантией уникальной скорости, а другая никогда не пострадает. Во второй раз, если он имеет одинаковую скорость, вам все еще нужны 3 случайных числа, так что шаг 2 нужно переделать, цикл цикла будет повторяться каждый раз, поэтому вам просто нужно вернуться к 0, чтобы цикл вернул вас к 1 – depperm

+0

Вы можете попробовать два предложения, которые я сделал с помощью цикла for, и я не вижу серьезных проблем. – depperm