2009-12-09 6 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 Lookup в другой список, и я думая, что я могу использовать jquery, чтобы сохранить только уникальные параметры, не задумываясь о том, что происходит.) Могу ли я удалить такие варианты? Благодарю.

ответ

31

Вы можете сделать это с помощью простого цикла - может быть поумнее способ справиться с этим с JQuery селекторы, что я не вижу, хотя. Следующие должны работать:

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

Edit: Вот функциональный стиль один вкладыш, который делает это с помощью превосходного 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

Думаю, что вам понадобится текст() not val() в этом случае. – Ryan

+2

Три примечания: 1. Я думаю, вы хотели бы использовать text(), а не val(); поскольку значения кажутся разными. 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(); 
}); 
Смежные вопросы