2009-12-09 30 views
11

Tôi có bộ chọn thả xuống được tạo từ danh sách và muốn lọc các tùy chọn để xóa các mục trùng lặp. ví dụ. Tôi muốn lọc ...Lọc các tùy chọn trùng lặp từ menu thả xuống chọn

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

... xuống để trình bày cho người dùng một cái gì đó giống như ...

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

(Các dữ liệu xuất phát từ một Lookup Sharepoint trên danh sách khác và tôi nghĩ rằng tôi có thể sử dụng jquery để chỉ giữ các tùy chọn duy nhất mà không cần phải đi sâu vào những gì đang diễn ra.) Tôi có thể xóa các tùy chọn như thế này không? Cảm ơn.

Trả lời

31

Bạn có thể làm điều đó với một vòng lặp đơn giản - có thể là một cách thông minh để xử lý này với bộ chọn jQuery mà tôi không nhìn thấy, mặc dù. Sau đây nên làm việc:

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

Edit: Dưới đây là một chức năng kiểu one-liner nào đó với sự giúp đỡ của các sắc Underscore.js, mặc dù các phiên bản trước là gần như chắc chắn hiệu quả hơn:

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

Cảm ơn. Đây là khá nhiều những gì tôi đang tìm kiếm, nhưng tôi đã bị ràng buộc với cú pháp JS. – afewscoops

6

Bạn có thể làm một cái gì đó như thế này:

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

Hãy suy nghĩ bạn sẽ muốn văn bản() không val() trong trường hợp này. – Ryan

+2

Ba ghi chú: 1. Tôi nghĩ bạn muốn sử dụng văn bản() thay vì val(); vì các giá trị dường như khác nhau. 2. Điều này sẽ không bắt trường hợp các giá trị trùng lặp thay thế (tức là Microsoft, Apple, Microsoft), mặc dù nó không rõ ràng từ câu hỏi ban đầu cho dù đó là một khả năng. 3. Tôi khuyên bạn nên gọi $ (this) chỉ một lần ở đầu hàm (tức là 'var option = $ (this);'), vì tôi tin rằng đó là một hoạt động vừa phải tốn kém. –

+0

Cảm ơn những suy nghĩ tốt đẹp. val(), tuy nhiên, đã trả lại giá trị chính xác cho tôi trong trường hợp này. Tôi đồng ý văn bản sẽ tốt hơn. –

5

Bạn có thể thử mã sau, nó sẽ loại bỏ các bản sao bất kể vị trí của chúng. Ở đây #targetSelect là mục tiêu thả xuống của bạn

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(); 
}); 
Các vấn đề liên quan