Desordena a los elementos del array
data.seed
y luego ve tomándolos uno por uno en el orden en que terminen, así ya no tendrás que hacer varias verificaciones por cada clic.
Código Javascript
:
Ver original$(function () {
var data = {"seed": [
{
"num1":"title1",
"num2":"title2",
"num3": [ "1","2","3" ]
},
{
"num1":"title3",
"num2":"title4",
"num3": [ "a","b","c" ]
},
{
"num1":"title5",
"num2":"title6",
"num3": [ "d","gh","34" ]
}
]},
conta = data.seed.length,
recorre = data.seed,
contador, joke = $('.word'), result, categ, newElement,
medio, ultimo, indexMedio = Math.floor(conta / 2);
function desordenar(){
var random, aux;
for (var i = 0; i < conta; i++){
random = Math.floor(Math.random() * conta);
aux = data.seed[i];
data.seed[i] = data.seed[random];
data.seed[random] = aux;
}
if (medio == data.seed[indexMedio]){
aux = data.seed[0];
data.seed[0] = data.seed[indexMedio];
data.seed[indexMedio] = aux;
}
if (ultimo == data.seed[0]){
aux = data.seed[0];
data.seed[0] = data.seed[conta - 1];
data.seed[conta - 1] = aux;
}
}
function getNumbers(){
result = data.seed[contador].num3;
categ = data.seed[contador].num1;
joke.empty();
for (var c in result) {
newElement = document.createElement('div');
newElement.id = result[c];
newElement.innerHTML = result[c];
joke.append(newElement);
}
contador++;
}
function init() {
if (contador <= conta - 1){
getNumbers();
}
else{
ultimo = data.seed[conta - 1];
contador = 0;
desordenar();
getNumbers();
}
}
contador = 0;
medio = data.seed[indexMedio];
desordenar();
$("button").click(init);
});
Todo lo hago en tres funciones. Primero, declaro las variables que usaré, quedando así en el alcance global y así no tendremos problemas dentro de las funciones. También defino las funciones que usaremos, inicializo el valor del contador en cero y ejecuto la función
desordenar
, para que desde un inicio tengamos al array desordenado, además, tomo al segundo objeto del array, para que en un futuro desordenamiento, en caso de que queden como al inicio, intercambio el elemento medio por uno de los extremos y así no se volverá a repetir la secuencia.
Luego, al dar un clic al botón, ejecuto la función
init
, la cual verifica si el valor del contador que usaremos para ir avanzando en la cuenta de elementos del array, es menor o igual a la última posición del array 'data.seed'; de ser así, ejecuto la función
getNumbers
. En dicha función, simplemente tomo a los valores que correspondan según el orden establecido por el contador y, al final, aumento el valor del mismo en uno.
Cuando el valor del contador sea mayor que la última posición del array, tomo a dicho objeto (el último) y lo almaceno en la variable
ultimo
, vuelvo a inicializar al contador en cero, para empezar otra vez con la secuencia, y ejecuto las funciones
desordenar
, para obtener un nuevo desordenamiento y así otra secuencia, y
getNumbers
, para tomar al primer objeto que corresponda en la nueva secuencia generada.
En la función
desordenar
, luego de realizar el desordenamiento, como mencioné al inicio de la explicación, si se repite el elemento medio original con el de la nueva secuencia, lo intercambio por el primero, además, verifico si el último objeto de la secuencia anterior, es igual al primero de la nueva secuencia; de ser así, lo intercambio por el último de la actual secuencia, para que así no se repitan el último de la última secuencia con el primer de esta nueva.
De esta manera, nunca habrá una repetición ni dentro de una secuencia ni de una secuencia a otra.
DEMO
Saludos