2009-12-09 25 views
11

Tengo un selector desplegable generado a partir de una lista y quiero filtrar las opciones para eliminar las entradas duplicadas. p.ej. Quiero filtrar ...Filtrar opciones duplicadas del menú desplegable de selección

<select name="company"> 
    <option "1">Microsoft</option> 
    <option "2">Microsoft</option> 
    <option "3">Microsoft</option> 
    <option "4">Microsoft</option> 
    <option "5">Apple</option> 
    <option "6">Apple</option> 
    <option "7">Google</option> 
</select> 

... abajo para presentar al usuario con algo como ...

<select name="company"> 
    <option "1">Microsoft</option> 
    <option "5">Apple</option> 
    <option "7">Google</option> 
</select> 

(Los datos provienen de una búsqueda de SharePoint en otra lista y estoy pensando que puedo usar jquery para mantener solo las opciones únicas sin tener que entrar en las entrañas de lo que está pasando.) ¿Puedo eliminar opciones como esta? Gracias.

Respuesta

31

Usted puede hacerlo con un bucle simple - no puede haber una manera más inteligente para manejar esto con selectores de jQuery que no estoy viendo, sin embargo. El siguiente debería funcionar:

var usedNames = {}; 
$("select[name='company'] > option").each(function() { 
    if(usedNames[this.text]) { 
     $(this).remove(); 
    } else { 
     usedNames[this.text] = this.value; 
    } 
}); 

Editar: Aquí hay una sola línea de estilo funcional que lo hace con la ayuda de la excelente Underscore.js, aunque la versión anterior es casi con toda seguridad más eficiente:

_.each(_.uniq(_.pluck($("select[name='company'] > option").get(), 'text')), function(name) { $("select[name='company'] > option:contains(" + name + ")").not(":first").remove(); }); 
+0

Gracias. Esto es más o menos lo que estaba buscando, pero me estaba atando con la sintaxis de JS. – afewscoops

6

se puede hacer algo como esto:

var previousOption; 
$('select[name=company] option').each(function() { 
    if (this.text == previousOption) $(this).remove(); 
    previousOption= this.text; 
}); 
+0

Creo que va a querer el texto() no val() en este caso. – Ryan

+2

Tres notas: 1. Creo que le gustaría usar texto() en lugar de val(); ya que los valores parecen ser diferentes. 2. Esto no detectaría un caso en el que los valores duplicados se alternan (es decir, Microsoft, Apple, Microsoft), aunque no está claro en la pregunta original si eso es una posibilidad. 3. Recomiendo llamar $ (this) una sola vez al comienzo de la función (es decir, 'var option = $ (this);'), ya que considero que es una operación moderadamente costosa. –

+0

Gracias por los buenos pensamientos. val(), sin embargo, devolvió el valor correcto para mí en este caso. Estoy de acuerdo en que el texto sería mejor. –

5

Puede probar el siguiente código, eliminará los duplicados independientemente de su posición. Aquí #targetSelect es su lista desplegable de destino

var a = new Array(); 
$(#targetSelect).children("option").each(function(x){ 
test = false; 
b = a[x] = $(this).text(); 
for (i=0;i<a.length-1;i++){ 
if (b ==a[i]) test =true; 
} 
if (test) $(this).remove(); 
}); 
Cuestiones relacionadas