2014-08-29 4 views
0

Как и на этот вопрос here Я хотел бы узнать, как удалить дубликаты параметров из выпадающих списков, однако я хотел бы отобразить список идентификаторов для поиска и просмотра если у них есть повторяющиеся опции для сращивания, а не только один входной селектор.Удалить несколько повторяющихся параметров из раскрывающегося списка

Пример этого будет выглядеть следующим образом:

<select id="MeatList"> 
<option value="OBgYN7" >Ham</option> 
<option value="ELmn5">Beef</option> 
<option value="KrUKt6">Chicken</option> 
<option value="OBgYN7" selected="selected">Ham</option> 
</select> 

<select id="Seats"> 
<option value="2" >Table For Two</option> 
<option value="3">Table For Three</option> 
<option value="5">Table for Five</option> 
<option value="10" >Party Table</option> 
</select> 

<select id="Lastname"> 
<option value="Tao" >The Tao's</option> 
<option value="Smith">The Smith's</option> 
<option value="Samuels">The Samuels'</option> 
<option value="Smith" >The Smith's</option> 
</select> 

Как вы можете видеть, входы MeatList и Lastname имеет одинаковые значения, я хочу, чтобы иметь возможность искать все выпадающие ящики для повторяющихся значений (или внутренний текст) и сплайсируйте их. Будет ли это возможным путем сопоставления?

код для использования будет:

[].slice.call(fruits.options) 
    .map(function(a){ 
    if(this[a.innerText]){ 
     if(!a.selected) fruits.removeChild(a); 
    } else { 
     this[a.innerText]=1; 
    } 
    },{}); 

И, чтобы получить представление о том, что я имею в виду отображение выпадающих списков, я хотел бы использовать такой код:

var idlist= ["MeatList", "Seats", "Lastname"]; 
    var handlelists = idlist.join("|"); 
    [].slice.call(handlelists.options) 
     .map(function(a){ 
     if(this.search([a.innerText])){ 
      if(!a.selected) handlelists.removeChild(a); 
     } else { 
      this[a.innerText]=1; 
     } 
     },{}); 
+1

Является ли выбор, сгенерированный серверным скриптом? Если да, подумайте, сделайте ли там работу –

+0

Хотите ли вы обмануть каждый из своих списков самостоятельно или отменить общий список опций? Также мы можем предположить, что значение и текст будут повторяться (т. Е. Только текст значения?) – ocodo

+0

@EmacsFodder Каждый список сам по себе; и да, справедливо предположить, что текст такой же, как значения – Brad

ответ

1

Не знаете, что вы думали в части вашего скрипта. Вам просто нужно обернуть другой сегмент в итераторе (forEach) после нахождения элементов, соответствующих идентификаторам.

var idList= ["MeatList", "Seats", "Lastname"].map(function(id){return document.getElementById(id)}); 

idList.forEach(function(select){ 
    [].slice.call(select.options) 
    .map(function(a){ 
    if(this[a.value]){ 
     select.removeChild(a); 
    } else { 
     this[a.value]=1; 
    } 
    },{}); 
}); 

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

function deDuplicate(select){ 
    [].slice.call(select.options) 
    .map(function(a){ 
     if(this[a.value]){ 
     select.removeChild(a); 
     } else { 
     this[a.value]=1; 
     } 
    },{}); 
} 

, а затем:

var idList= ["MeatList", "Seats", "Lastname"].map(function(id){return document.getElementById(id)});  
idList.forEach(function(select){ deDuplicate(select); }); 

Лично я рекомендую обучение/с использованием CoffeeScript, как это uncrufts Javascript большого, то де-простофиля выглядит следующим образом:

deDuplicate = (select)-> 
    [].slice.call(select.options).map (a)-> 
    if @[a.value] 
     select.removeChild a 
    else 
     @[a.value] = 1 
    , {} 

, а затем обернутые вы можете сделать:

deDuplicate select for select in ["MeatList", "Seats", "Lastname"].map (id)-> 
    document.getElementById id 

Что читается более просто, как английский, по крайней мере для меня это так. Как всегда YMMV.

+0

CoffeeScript определенно выглядит намного чище, я обязательно попробую его прочитать. Спасибо – Brad

+0

Кроме того, как можно было бы нацелить ребенка в группу выбора? Это не особый ребенок селектора. – Brad

+0

@ Особенно вы имеете в виду '' collection? – ocodo