2009-12-09 9 views
11

Ich habe eine Dropdown-Selektor aus einer Liste generiert und möchten die Optionen zum Entfernen der doppelten Einträge filtern. z.B. Ich möchte filtern ...Filter doppelte Optionen aus Dropdown-Liste

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

... Sie die Benutzer mit etwas präsentieren wie ...

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

(Die Daten stammen aus einer Sharepoint-Lookup auf einer anderen Liste und ich bin Ich denke, ich kann jQuery verwenden, um nur die einzigartigen Optionen zu behalten, ohne in den Kern des Geschehens gehen zu müssen. Kann ich solche Optionen entfernen? Vielen Dank.

Antwort

31

Sie es mit einer einfachen Schleife tun können - es kann ein cleverer Weg, um diese Wähler mit jQuery zu behandeln, die ich allerdings nicht zu sehen. Folgendes sollte funktionieren:

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

Edit: Hier ist eine funktionelle Stil Einzeiler, die es mit Hilfe der ausgezeichneten Underscore.js der Fall ist, obwohl die vorherige Version mit ziemlicher Sicherheit effizienter ist:

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

Danke. Das ist ziemlich genau das, wonach ich suchte, aber ich wurde mit der JS-Syntax verbunden. – afewscoops

6

Sie können etwas tun:

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

Denken Sie, dass Sie die text() nicht val() in diesem Fall wollen. – Ryan

+2

Drei Anmerkungen: 1. Ich denke, Sie würden lieber text() als val(); da die Werte unterschiedlich zu sein scheinen. 2. Dies würde keinen Fall erfassen, in dem sich doppelte Werte abwechseln (d. H. Microsoft, Apple, Microsoft), obwohl aus der ursprünglichen Frage nicht klar ist, ob dies möglich ist. 3. Ich würde empfehlen, $ (this) nur einmal am Anfang der Funktion aufzurufen (d. H. 'Var option = $ (this);'), weil ich glaube, dass es eine ziemlich teure Operation ist. –

+0

Danke für die guten Gedanken. val() hat jedoch in diesem Fall den richtigen Wert für mich zurückgegeben. Ich stimme zu, dass Text besser wäre. –

5

Sie können den folgenden Code versuchen, es entfernt die Duplikate unabhängig von ihrer Position. Hier #targetSelect ist Ihr Ziel Dropdown