Я пытаюсь создать сайт, на котором он случайным образом выбирает фотографию из массива, затем пользователь может использовать клавиши со стрелками, чтобы нажать «Далее» и загрузить другое случайное изображение, если они нажмут назад, оно загрузит предыдущее изображение. У меня все это работает:

Единственная проблема в том, что когда я нажимаю "Кол-во раз =" до длины массива, я получаю сообщение об ошибке, в котором говорится, что превышен максимальный размер стека вызовов.

Как мне исправить?

Код:

var rand = imagesArray[Math.floor(Math.random() * imagesArray.length)];
var theImg = document.getElementById('gif');
theImg.src=rand;
theImg.height = 700;
theImg.width = 1920;
var usedImages = {};
var usedImagesCount = 0;
var numHistory = [];

function displayPreviousImage(){
    if (numHistory.length > 1){
      numHistory.pop();
      var num = numHistory[numHistory.length-1];
      document.canvas.src = imagesArray[num];
    }
}

function displayNextImage(){

    var num = Math.floor(Math.random() * (imagesArray.length));

    if (!usedImages[num]){
        numHistory.push(num);
        document.canvas.src = imagesArray[num];
        usedImages[num] = true;
        if (usedImagesCount === imagesArray.length){
            usedImagesCount = 0;
			num = 0;
            usedImages = {};
			console.log("done")
        }
    } else {
        displayNextImage();
    }
}
0
WeDa Beast 20 Апр 2018 в 04:15

1 ответ

Лучший ответ

Ваша функция создаст бесконечный цикл, когда usedImages будет иметь весь возможный индекс в вашем массиве. Есть еще одно решение, которое проще для вас: сначала перетасуйте массив изображений, а затем просто позвольте пользователю просматривать его в новом порядке от 0 до n. Таким образом, вы по-прежнему будете обслуживать изображения случайным образом, но вам не нужно будет отслеживать использованные изображения.

function shuffle(array) {
  var m = array.length, t, i;

  // While there remain elements to shuffle…
  while (m) {

    // Pick a remaining element…
    i = Math.floor(Math.random() * m--);

    // And swap it with the current element.
    t = array[m];
    array[m] = array[i];
    array[i] = t;
  }

 return array;
}
0
Hank Phung 20 Апр 2018 в 01:36