2009-12-09 3 views
11

J'ai un sélecteur déroulant généré à partir d'une liste et je souhaite filtrer les options pour supprimer les entrées en double. par exemple. Je veux filtrer ...Filtrer les options dupliquées à partir de la liste déroulante sélectionnée

<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> 

... vers le bas pour présenter à l'utilisateur quelque chose comme ...

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

(Les données proviennent d'une recherche sur Sharepoint une autre liste et je suis Je pense que je peux utiliser jquery pour ne garder que les options uniques sans devoir aller au fond de ce qui se passe.) Puis-je supprimer des options comme celle-ci? Merci.

Répondre

31

Vous pouvez le faire avec une simple boucle - il peut y avoir une façon de gérer intelligent avec ce sélecteurs jQuery que je ne vois pas, cependant. Ce qui suit devrait fonctionner:

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

Edit: est ici un style fonctionnel d'une doublure qui le fait avec l'aide de l'excellent Underscore.js, bien que la version précédente est certainement plus efficace:

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

Merci. C'est à peu près ce que je cherchais, mais j'étais en train de me ligoter avec la syntaxe JS. – afewscoops

6

Vous pouvez faire quelque chose comme ceci:

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

Pensez que vous allez vouloir le texte() pas val() dans ce cas. – Ryan

+2

Trois notes: 1. Je pense que vous voudriez utiliser text() plutôt que val(); puisque les valeurs semblent être différentes. 2. Ceci n'attraperait pas un cas où des valeurs en double alternent (c'est-à-dire Microsoft, Apple, Microsoft), bien que la question initiale ne permette pas de savoir si c'est une possibilité. 3. Je recommande d'appeler $ (this) une seule fois au début de la fonction (c'est-à-dire 'var option = $ (this);'), car je pense que c'est une opération modérément coûteuse. –

+0

Merci pour les bonnes pensées. val(), cependant, a renvoyé la valeur correcte pour moi dans ce cas. Je suis d'accord que le texte serait mieux. –

5

Vous pouvez essayer le code suivant, il supprimera les doublons quelle que soit leur position. Ici #targetSelect est votre cible Dropdown

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(); 
}); 
Questions connexes