Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Mostrar en un select los elementos de un array sin repetir

Estas en el tema de Mostrar en un select los elementos de un array sin repetir en el foro de Javascript en Foros del Web. Hola Tengo un Select y saco los datos de los options de un array, pero en este array hay algunos elementos que están repetidos y ...
  #1 (permalink)  
Antiguo 03/07/2014, 09:26
 
Fecha de Ingreso: enero-2014
Mensajes: 91
Antigüedad: 10 años, 3 meses
Puntos: 2
Mostrar en un select los elementos de un array sin repetir

Hola

Tengo un Select y saco los datos de los options de un array, pero en este array hay algunos elementos que están repetidos y necesito que en el select al mostrar dichos elementos estos no se repitan, en el caso del ejemplo, al deplegar el Select nos aparecería dos veces el fútbol, como podría hacer para que se muestre una sola vez?.
Gracias

Código Javascript:
Ver original
  1. var deportes = new Array();
  2. deportes = [['Jose','futbol'],
  3. ['Luis','balonmano'],
  4. ['Antonio','baloncesto'],
  5. ['Mario','futbol']];
  6.  
  7. function cambiar(){
  8.    
  9.   var despleDeportes = document.getElementById("despleDeportes");  
  10.   for (var i = 0; i < deportes.length; i++) {    
  11.     despleDeportes.options[i] = new Option (deportes[i][1]);   
  12.     despleDeportes.options[i].value = deportes[i[1]];
  13.     despleDeportes.options[i].text = deportes[i][1];
  14.    }
  15.    despleDeportes.options[0].selected.text=1;  
  16. }

Código HTML:
Ver original
  1. <select id="despleDeportes">
  2.   <option>Todas los deportes</option>  
  3.   </select>
  #2 (permalink)  
Antiguo 03/07/2014, 09:34
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 7 meses
Puntos: 578
Respuesta: Mostrar en un select los elementos de un array sin repetir

Los de PHPJS hicieron una transcripción del array_unique() de PHP para Javascript:

http://phpjs.org/functions/array_unique/

Sería cuestión de pasar el array por dicha función y guardar el resultado obtenido
  #3 (permalink)  
Antiguo 03/07/2014, 10:22
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Mostrar en un select los elementos de un array sin repetir

O también puedes construir tu propia función de filtrado que retorne un array con valores únicos:

Código Javascript:
Ver original
  1. var array_unique = function(array){
  2.     var array_filtrado = [];
  3.         if (!Array.prototype.forEach){
  4.             var total = array.length;
  5.             for (var i = 0; i < total; i++)
  6.                 if (!Array.prototype.indexOf){
  7.                     var repeticiones = false;
  8.                     for (var j = i + 1; j < total; j++)
  9.                         if (array[i] == array[j]){
  10.                             repeticiones = true;
  11.                             break;
  12.                         }
  13.                     if (repeticiones) array_filtrado.push(array[i]);
  14.                 }
  15.                 else
  16.                     if (array_filtrado.indexOf(array[i]) == -1)
  17.                         array_filtrado.push(array[i]);
  18.         }
  19.         else
  20.             array.forEach(function(valor){
  21.                 if (array_filtrado.indexOf(valor) == -1)
  22.                     array_filtrado.push(valor);
  23.             });
  24.         return array_filtrado;
  25.     };
  26.  
  27. console.log(array_unique([1, 3, 4, 2, 1, 2, 1, 3, 1])); //[1, 3, 4, 2]
  28. console.log(array_unique([5, 5, 1, 2, 1, 4, 5])); //[5, 1, 2, 4]

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; 04/07/2014 a las 20:14 Razón: Mejora para compatibilidad con IE5.5+
  #4 (permalink)  
Antiguo 04/07/2014, 13:43
 
Fecha de Ingreso: enero-2014
Mensajes: 91
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Mostrar en un select los elementos de un array sin repetir

Gracias a los dos por responder

He probado con el código de Alexis y funciona si el array tiene un elemento sólo, como en este caso
Código Javascript:
Ver original
  1. var deportes = new Array();
  2. deportes = ['futbol','balonmano','baloncesto','futbol'];
Pero si tiene varios y necesito que me muestre el segundo, el que corresponde con el deporte, como este ejemplo de abajo, ya no funciona y poniendo array[i][1] para indicar que es el segundo elemento sobre el que tiene que actuar deberia funcionar, pero no es así, algo se me escapa

Código Javascript:
Ver original
  1. var deportes = new Array();
  2. deportes = [['Jose','futbol'],
  3. ['Luis','balonmano'],
  4. ['Antonio','baloncesto'],
  5. ['Mario','futbol']];
  #5 (permalink)  
Antiguo 04/07/2014, 14:48
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Mostrar en un select los elementos de un array sin repetir

Solo era cuestión de que adaptes la función a tus necesidades.

Código Javascript:
Ver original
  1. var array_unique = function(array){
  2.     var coincidencias = [],
  3.         array_filtrado = [];
  4.         if (!Array.prototype.forEach){
  5.             var total = array.length;
  6.             for (var i = 0; i < total; i++)
  7.                 if (!Array.prototype.indexOf){
  8.                     var repeticiones = false;
  9.                     for (var j = i + 1; j < total; j++)
  10.                         if (array[i][1] == array[j][1]){
  11.                             repeticiones = true;
  12.                             break;
  13.                         }
  14.                     if (repeticiones) array_filtrado.push(array[i]);
  15.                 }
  16.                 else
  17.                     if (array_filtrado.indexOf(array[i][1]) == -1)
  18.                         array_filtrado.push(array[i]);
  19.         }
  20.         else
  21.             array.forEach(function(valor){
  22.                 if (coincidencias.indexOf(valor[1]) == -1){
  23.                     coincidencias.push(valor[1]);
  24.                     array_filtrado.push(valor);
  25.                 }
  26.             });
  27.         return array_filtrado;
  28.     },
  29.     deportes = [
  30.         ['Jose', 'futbol'],
  31.         ['Luis', 'balonmano'],
  32.         ['Antonio', 'baloncesto'],
  33.         ['Mario', 'futbol']
  34.     ];
  35.  
  36. document.body.innerHTML = array_unique(deportes).join("<br />");

Lo anterior imprimirá lo siguiente:

Código HTML:
Ver original
  1. Jose,futbol
  2. Luis,balonmano
  3. Antonio,baloncesto

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; 04/07/2014 a las 20:15 Razón: Palabra repetida
  #6 (permalink)  
Antiguo 05/07/2014, 04:45
 
Fecha de Ingreso: mayo-2013
Mensajes: 38
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Mostrar en un select los elementos de un array sin repetir

Ahora si funciona he hecho algunas modificaciones para que me muestre sólo los elementos del campo deporte que es lo que necesito y el código ha quedado así
Código Javascript:
Ver original
  1. var array_unique = function(array){
  2.      var coincidencias = [],
  3.          array_filtrado = [];
  4.          if (!Array.prototype.forEach){
  5.              var total = array.length,
  6.                  repeticiones = 0;
  7.              for (var i = 0; i < total; i++)
  8.                  if (!Array.prototype.indexOf){
  9.                      repeticiones = 0;
  10.                      for (var j = i + 1; j < total; j++)
  11.                          if (array[i][1] == array[j][1]){
  12.                              repeticiones++;
  13.                              break;
  14.                          }
  15.                      if (!repeticiones) array_filtrado.push(array[i]);
  16.                  }
  17.                  else
  18.                      if (array_filtrado.indexOf(array[i][1]) == -1)
  19.                          array_filtrado.push(array[i]);
  20.          }
  21.          else
  22.              array.forEach(function(valor){
  23.                  if (coincidencias.indexOf(valor[1]) == -1){
  24.                      coincidencias.push(valor[1]);
  25.                      array_filtrado.push(valor[1]);
  26.                  }
  27.              });
  28.          return array_filtrado;
  29.      };
Pero la función esta la necesito, como he explicado al principio para un select y necesito que cada deporte sea una opción dentro del select, ya que al pulsar en cada uno de los deportes hará una cosa.
Este es el select modificado con tu función pero lógicamente, no lo he hecho bien porque me muestra todos los deportes en una sóla linea.
Código Javascript:
Ver original
  1. function cambiar(){
  2.    
  3.   var despleDeportes = document.getElementById("despleDeportes");  
  4.   for (var i = 0; i < deportes.length; i++) {  
  5.     despleDeportes.options[i] = new Option (array_unique(deportes));   
  6.     despleDeportes.options.value = (array_unique(deportes));
  7.     despleDeportes.options.text = (array_unique(deportes));
  8.     despleDeportes.options[i].value = "Valor"; 
  9.    }
  10.    despleDeportes.options[0].selected=1;    
  11. }
Código HTML:
Ver original
  1. <body onload="cambiar()">
  2.  <select id="despleDeportes">
  3.   <option>Todos los deportes</option>  
  4.   </select>
  #7 (permalink)  
Antiguo 05/07/2014, 07:14
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Mostrar en un select los elementos de un array sin repetir

El problema está en que por cada opción añades al array entero de deportes cuando lo que debes de hacer es recorrer a dicho array y en cada iteración añadir cada una de sus opciones al <select>.

Código Javascript:
Ver original
  1. var array_unique = function(array){
  2.     var coincidencias = [],
  3.         array_filtrado = [];
  4.         if (!Array.prototype.forEach){
  5.             var total = array.length;
  6.             for (var i = 0; i < total; i++)
  7.                 if (!Array.prototype.indexOf){
  8.                     var repeticiones = false;
  9.                     for (var j = i + 1; j < total; j++)
  10.                         if (array[i][1] == array[j][1]){
  11.                             repeticiones = true;
  12.                             break;
  13.                         }
  14.                     if (repeticiones) array_filtrado.push(array[i]);
  15.                 }
  16.                 else
  17.                     if (array_filtrado.indexOf(array[i][1]) == -1)
  18.                         array_filtrado.push(array[i]);
  19.         }
  20.         else
  21.             array.forEach(function(valor){
  22.                 if (coincidencias.indexOf(valor[1]) == -1){
  23.                     coincidencias.push(valor[1]);
  24.                     array_filtrado.push(valor[1]);
  25.                 }
  26.             });
  27.         return array_filtrado;
  28.     },
  29.     deportes = [
  30.         ['Jose', 'futbol'],
  31.         ['Luis', 'balonmano'],
  32.         ['Antonio', 'baloncesto'],
  33.         ['Mario', 'futbol']
  34.     ];
  35.  
  36. var opciones = array_unique(deportes),
  37.     total = opciones.length,
  38.     lista = document.getElementById("despleDeportes");
  39.  
  40. for (var i = 0; i < total; i++){
  41.     var opcion = document.createElement("option");
  42.     opcion.value = opciones[i];
  43.     opcion.innerHTML = opciones[i];
  44.     lista.appendChild(opcion);
  45. }

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
  #8 (permalink)  
Antiguo 07/07/2014, 12:17
 
Fecha de Ingreso: enero-2014
Mensajes: 91
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Mostrar en un select los elementos de un array sin repetir

Ahora si funciona perfectamente, muchas gracias

Etiquetas: elementos, repetir, select
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 11:30.