Ver Mensaje Individual
  #2 (permalink)  
Antiguo 01/12/2014, 22:54
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Array sin repetir valor

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
  1. $(function () {
  2.     var data = {"seed": [
  3.             {
  4.                 "num1":"title1",
  5.                 "num2":"title2",
  6.                 "num3": [ "1","2","3" ]
  7.             },
  8.             {
  9.                 "num1":"title3",
  10.                 "num2":"title4",
  11.                 "num3": [ "a","b","c" ]
  12.             },
  13.             {
  14.                 "num1":"title5",
  15.                 "num2":"title6",
  16.                 "num3": [ "d","gh","34" ]
  17.             }
  18.     ]},
  19.     conta = data.seed.length,
  20.     recorre = data.seed,
  21.     contador, joke = $('.word'), result, categ, newElement,
  22.     medio, ultimo, indexMedio = Math.floor(conta / 2);
  23.  
  24.     function desordenar(){
  25.         var random, aux;
  26.         for (var i = 0; i < conta; i++){
  27.             random = Math.floor(Math.random() * conta);
  28.             aux = data.seed[i];
  29.             data.seed[i] = data.seed[random];
  30.             data.seed[random] = aux;
  31.         }
  32.         if (medio == data.seed[indexMedio]){
  33.             aux = data.seed[0];
  34.             data.seed[0] = data.seed[indexMedio];
  35.             data.seed[indexMedio] = aux;
  36.         }
  37.         if (ultimo == data.seed[0]){
  38.             aux = data.seed[0];
  39.             data.seed[0] = data.seed[conta - 1];
  40.             data.seed[conta - 1] = aux;
  41.         }
  42.     }
  43.    
  44.     function getNumbers(){
  45.         result = data.seed[contador].num3;
  46.         categ = data.seed[contador].num1;
  47.  
  48.         joke.empty();
  49.  
  50.         for (var c in result) {
  51.             newElement = document.createElement('div');
  52.             newElement.id = result[c];  
  53.             newElement.innerHTML = result[c];
  54.             joke.append(newElement);
  55.         }
  56.        
  57.         contador++;
  58.     }
  59.  
  60.     function init() {
  61.         if (contador <= conta - 1){
  62.             getNumbers();
  63.         }
  64.         else{
  65.             ultimo = data.seed[conta - 1];
  66.             contador = 0;
  67.             desordenar();
  68.             getNumbers();  
  69.         }
  70.     }
  71.    
  72.     contador = 0;
  73.     medio = data.seed[indexMedio];
  74.     desordenar();  
  75.    
  76.     $("button").click(init);
  77. });

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
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 02/12/2014 a las 00:12 Razón: Mejora