Domanda

Ho un selettore a discesa generato da un elenco e voglio filtrare le opzioni per rimuovere le voci duplicate. per esempio. Voglio filtrare ...

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

... giù per presentare l'utente con qualcosa di simile ...

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

(I dati provengono da un Lookup SharePoint in un altro elenco e sto pensando che posso usare jQuery per mantenere solo le opzioni uniche senza dover andare nelle viscere di quello che sta succedendo.) Posso rimuovere le opzioni come questo? Grazie.

È stato utile?

Soluzione

È possibile farlo con un semplice loop - ci può essere un modo più intelligente per gestire questa situazione con selettori di jQuery che non sto vedendo, però. Il seguente dovrebbe funzionare:

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

Modifica Ecco un funzionale in stile one-liner che lo fa con l'aiuto di eccellente Underscore.js , anche se la versione precedente è quasi certamente più efficiente:

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

Altri suggerimenti

Si può fare qualcosa di simile:

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

È possibile provare il seguente codice, rimuoverà i duplicati indipendentemente dalla loro posizione. Ecco #targetSelect è il vostro target a discesa

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();
}); 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top