2009-12-09 144 views
11

我有一個從列表中生成的下拉選擇器,並且想要篩選選項以刪除重複的條目。例如我想篩選...從選擇下拉列表中篩選重複選項

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

...下呈現的東西,如用戶...

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

(數據來自一個SharePoint查找另一名單上,我以爲我可以使用jquery只保留唯一的選項,而不必進入正在發生的事情。)我可以刪除這樣的選項嗎?謝謝。

回答

31

你可以用一個簡單的循環做到這一點 - 有可能是與我沒有看到jQuery選擇來處理這一個聰明的方式,雖然。下面應該工作:

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

編輯:這裏有一個函數式的單行,與優秀Underscore.js的幫助下做吧,雖然以前的版本幾乎可以肯定是更有效的:

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

謝謝。這幾乎是我正在尋找的東西,但是我被綁定了JS語法。 – afewscoops 2009-12-10 13:09:17

6

你可以做這樣的事情:

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

認爲你要在這種情況下文本()不是val()。 – Ryan 2009-12-09 19:14:41

+2

三個注意事項: 1.我想你會想使用text()而不是val();因爲這些值看起來不同。 2.這並不能說明重複值交替出現的情況(即微軟,蘋果,微軟),儘管從最初的問題來看這是否是一種可能性。 3.我建議在函數的開頭只調用一次$(this)(即'var option = $(this);'),因爲我相信這是一個相當昂貴的操作。 – 2009-12-09 19:15:48

+0

感謝您的好想法。然而,val()在這種情況下確實爲我返回了正確的值。我同意文字會更好。 – 2009-12-09 19:28:30

5

您可以嘗試下面的代碼,它將刪除重複項,無論其位置如何。這裏#targetSelect是你的目標下拉

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