Показать 3 случайных элемента по идентификатору без повторения с помощью JQuery. Как убедиться, что он всегда возвращает 3? И переделать функцию нажатием той же кнопки?

У меня есть код для случайного отображения трех элементов по идентификатору без повторения, что обычно работает. Текущий код отображает три игральные карты, выбранные из 54 карт / элементов HTML. В настоящее время он работает нормально большую часть времени, но иногда он возвращает только две карты, а гораздо реже - только одну. Я хотел бы улучшить его, всегда возвращая три. Как бы я изменил приведенный ниже код для этого?

Кроме того, если я нажимаю кнопку, которая отображает три элемента / карты в случайном порядке дважды или более, он продолжает добавлять три карты при каждом последующем щелчке, пока не будет исчерпано очень много отображений и карт. Как бы я изменил приведенный ниже код так, чтобы он переделывал функцию (случайным образом отображал другой набор из трех карт на своем месте и скрывал первые три из первого клика).

Я хотел бы сохранить функциональность текущего кода выбора элементов по идентификатору, потому что он может быть использован для создания нескольких элементов, отличных от игральных карт.

CSS установлен на:

.cards {
    display: none;
}  

И код:

var myarray = [
"#card1","#card2","#card3","#card4","#card5","#card6","#card7"...];
var numberOfCards = 3;

function getRandom() {
    for (var i = 1; i <= numberOfCards; i++) {
    var randomIndex = RandomDiv();
    $('.cards:eq('+randomIndex+')').fadeIn(900).css('display', 'inline-block');
    myarray.splice(randomIndex, 1);
 }
}
$('.btn').on('click', function() {
    getRandom();
});

function RandomDiv() {
    return Math.floor(Math.random() * myarray.length);
};

Спасибо!

1 ответ

Решение

Вот решение без полного ремонта:

var myarray = ["#card1","#card2","#card3","#card4","#card5","#card6",
"#card7","#card8","#card9","#card10","#card11","#card12"];
var numberOfCards = 3;
$(".card").hide();

var previous = [];

function getRandom() {

   if(myarray.length<3){
       myarray = ["#card1","#card2","#card3","#card4","#card5","#card6",
              "#card7","#card8","#card9","#card10","#card11","#card12"];
   }
   
   for (var i = 1; i <= numberOfCards; i++) {
       var randomIndex = RandomDiv();
       previous.push(myarray[randomIndex]);
       $(myarray[randomIndex]).fadeIn(900);
       myarray.splice(randomIndex, 1);
   }
};

$('.btn').on('click', function() {
   for(k=0; k< numberOfCards; k++){
 $(previous[k]).hide(0);
   }
   previous = [];
   getRandom();
});

function RandomDiv() {
    return Math.floor(Math.random() * myarray.length);
};
.card{
  display: inline-block;
}

.btn{
  border: 1px solid
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="btn">
Deal
</div>
<div class="card" id ="card1" >1</div>
<div class="card" id ="card2" >2</div>
<div class="card" id ="card3" >3</div>
<div class="card" id ="card4" >4</div>
<div class="card" id ="card5" >5</div>
<div class="card" id ="card6" >6</div>
<div class="card" id ="card7" >7</div>
<div class="card" id ="card8" >8</div>
<div class="card" id ="card9" >9</div>
<div class="card" id ="card10" >10</div>
<div class="card" id ="card11" >11</div>
<div class="card" id ="card12" >12</div>

Все карты изначально скрыты, поэтому только fadeIn(900) нужно.

Помните, что массив myarray становится короче в каждой раздаче, поэтому вы должны возвращать сданные карты на нее, когда она заканчивается. Теперь это делается внутри getRandom функция.

Вот jsfiddle

Другие вопросы по тегам