Foros del Web » Programando para Internet » Javascript » Frameworks JS »

[SOLUCIONADO] Array sin repetir valor

Estas en el tema de Array sin repetir valor en el foro de Frameworks JS en Foros del Web. hola espero se encuentren bien, vengo con una pregunta ya que llevo rato peleandome con este codigo y no logro dar con el resultado imagino ...
  #1 (permalink)  
Antiguo 01/12/2014, 07:40
 
Fecha de Ingreso: julio-2012
Ubicación: puerto rico/mexico
Mensajes: 11
Antigüedad: 12 años, 4 meses
Puntos: 1
Pregunta Array sin repetir valor

hola espero se encuentren bien, vengo con una pregunta ya que llevo rato peleandome con este codigo y no logro dar con el resultado imagino que es algo sencillo pero llegue al punto de bloquearme y no doy a mas :S.

tengo un array que al hacer clic me muestra su valor en una forma random, hasta ahi todo bien, solo necesito que al hacer clic los valores no se vuelvan a repetir, es decir que si tengo 3 cadenas las recorra en forma random pero sin repetirlas, hay alguna forma de hacerlo?

ojala puedan guiarme, un saludo y que pasen buen dia...

Código:
$(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" ]
            }
    ]};
    var conta = data.seed.length;
    var recorre = data.seed;

    function getNumbers() {
        var jokeId = Math.floor((Math.random()*conta));
        var joke = $('.word');
        var result = data.seed[jokeId].num3;
        var categ = data.seed[jokeId].num1;
        joke.empty()
        for (var c in result) {
            var newElement = document.createElement('div');
            newElement.id = result[c];  
            newElement.innerHTML = result[c]; 
            joke.append(newElement);
        }
    }

    $( "button" ).click(function() {
        getNumbers();
    });
});
  #2 (permalink)  
Antiguo 01/12/2014, 22:54
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
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
  #3 (permalink)  
Antiguo 02/12/2014, 13:06
 
Fecha de Ingreso: julio-2012
Ubicación: puerto rico/mexico
Mensajes: 11
Antigüedad: 12 años, 4 meses
Puntos: 1
Respuesta: Array sin repetir valor

gracias de nuevo alexis!!! voy a revisar el codigo pero por lo que vi me funciona perfecto, pasa un excelente dia!!!

Etiquetas: javascript, jquery
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:45.