从选择下拉列表中筛选重复选项

问题描述:

我有一个从列表中生成的下拉选择器,并且想要筛选选项以删除重复的条目。例如我想筛选...从选择下拉列表中筛选重复选项

<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只保留唯一的选项,而不必进入正在发生的事情。)我可以删除这样的选项吗?谢谢。

你可以用一个简单的循环做到这一点 - 有可能是与我没有看到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

你可以做这样的事情:

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

您可以尝试下面的代码,它将删除重复项,无论其位置如何。这里#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(); 
});