@ZMaxonchik

Как реализовать проверку цикла js?

Доброй ночи!
Есть функция, которая срабатывает при onchange селектора.
Внутри нее есть цикл, который выводит свойство объекта из рандомного элемента массива, который выбран в селекторе.
Необходимо реализовать таким образом, чтобы цикл вывел свойства всех элементов массива в рандомном порядке, не повторяясь дважды.

Пытаюсь реализовать таким образом:
После каждого вывода свойства, цикл добавляет новое свойство "checked" в объект, тем самым если свойство из данного объекта уже показывалось, то у данного объекта есть свойство checked.

Также сделал проверку в цикле на наличие свойства "checked".

Сейчас результат кода может быть таким:
1
4
Фильмов больше нет
3
2
Фильмов больше нет

То есть else из цикла может сработать, не смотря на то, что еще остаются объекты без свойства checked.
Нужно сделать так, чтобы else срабатывал только в том случае, когда больше не осталось объектов без свойства checked.

Желаемый результат работы кода:
1
3
2
4
Фильмов больше нет

Надеюсь, меня кто-нибудь поймет и подскажет, заранее спасибо!

let getSelector = document.querySelector("#zhanr")
let getFilmTitle = document.querySelector(".film-title")
let getFilmBox  = document.querySelector(".film-box")
let getRandomFilm
let checkRandomCount


let allFilms = [
    {value:1, films:[
        {title: '1'},
        {title: '2'},
        {title: '3'},
        {title: '4'}
    ]},

    {value:2, films:[
        {title: '5'},
        {title: '6'},
        {title: '7'},
        {title: '8'}
    ]}
]

function randomInteger(min, max) {                          
       let rand = min + Math.random() * (max + 1 - min);
       return Math.floor(rand);
   }

let getZhanr = function() {
    
    getRandomFilm = randomInteger(0, 3)
    let getSelectedZhanr = getSelector.value
    let i
    
    if (getFilmBox.classList.contains("hide")) getFilmBox.classList.remove("hide")  
    for(i=0; i < allFilms.length; i++){      
        if ((allFilms[i].value == getSelectedZhanr) && (allFilms[i].films[getRandomFilm].hasOwnProperty('checked') == false)) {
            
            getFilmTitle.innerHTML = allFilms[i].films[getRandomFilm].title
            console.log(allFilms[i].films[getRandomFilm].title) 
            checkRandomCount = getRandomFilm
            
           allFilms[i].films[getRandomFilm]['checked'] = 'yes'
           break
        } 
        else {
            getFilmTitle.innerHTML = "Фильмов больше нет"
            console.log("Фильмов больше нет")
        }  
        
      }
    
    
}
  • Вопрос задан
  • 492 просмотра
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Промежуточный стэк нужен.
1. Делаете копию id-шников с реального списка и оттуда берёте случайным образом нужный id-шник.
2. После просмотра - в реальном меняете флаг на checked, а из стэка - убираете элемент.
3. Когда стэк опустеет - снова выборка из реального списка, где нет флага "checked", и т.д. по кругу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы