2009-12-09 5 views
11

목록에서 생성 된 드롭 다운 선택기가 있으며 중복 항목을 제거하는 옵션을 필터링하려고합니다. 예 : 나는 선택 드롭 다운에서 중복 옵션 필터링

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

는 (데이터는 다른 목록에 셰어 조회에서 온다 ... 아래처럼 뭔가를 사용자에게 제시 ... 필터링

<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> 
를 원하고 난 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

6

당신은 같은 것을 할 수 있습니다

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

이 경우에는 text()가 아닌 val()을 원할 것입니다. – Ryan

+2

세 노트 : 1. val()보다는 text()를 사용하고 싶다고 생각합니다. 값이 다르기 때문에 나타납니다. 2. 원래의 질문에서 그 가능성 여부가 확실하지 않더라도 중복 된 값 (예 : Microsoft, Apple, Microsoft)이있는 경우를 파악할 수 없습니다. 3. 함수의 시작 부분에 $ (this)를 한 번만 호출하는 것이 좋습니다 (예 :'var option = $ (this))'). –

+0

좋은 생각을 해주셔서 감사합니다. 그러나 val()은이 경우 올바른 값을 반환했습니다. 나는 텍스트가 더 좋을 것이라고 동의한다. –

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(); 
}); 
관련 문제