2011-07-12 37 views
17

Tôi đang tìm một hàm sẽ lấy danh sách các tùy chọn trong danh sách lựa chọn và sắp xếp chúng theo thứ tự bảng chữ cái nhưng với một twist. Tất cả các giá trị có văn bản 'NA' sẽ được đẩy vào cuối danh sách.Sắp xếp các tùy chọn trong danh sách Chọn với javascript/jQuery .. nhưng không theo thứ tự abc

Vì vậy, cung cấp một danh sách -

<select> 
    <option value="1">Car</option> 
    <option value="2">Bus</option> 
    <option value="3">NA</option> 
    <option value="4">Bike</option> 
    <option value="5">Tractor</option> 
    <option value="6">NA</option> 
</select> 

Chúng ta nên kết thúc với -

<select> 
    <option value="4">Bike</option> 
    <option value="2">Bus</option> 
    <option value="1">Car</option> 
    <option value="5">Tractor</option> 
    <option value="3">NA</option> 
    <option value="6">NA</option> 
</select> 

Thứ tự của các NAS là không quan trọng.

Và đừng hỏi tại sao tôi không thể chỉ cần loại bỏ NAS (hoặc lý do tại sao sẽ có nhiều lựa chọn với các văn bản tương tự nhưng giá trị tiềm ẩn khác nhau, bởi vì tôi không đồng ý với điều đó.

+0

Đáng lưu ý cho tất cả các câu trả lời này: sắp xếp sẽ thay đổi tùy chọn nào được chọn. Bạn phải duy trì giá trị của phần tử select trước khi sắp xếp và khôi phục nó sau đó. –

Trả lời

45

demo: http://jsfiddle.net/4bvVz/

function NASort(a, b) {  
    if (a.innerHTML == 'NA') { 
     return 1; 
    } 
    else if (b.innerHTML == 'NA') { 
     return -1; 
    }  
    return (a.innerHTML > b.innerHTML) ? 1 : -1; 
}; 

$('select option').sort(NASort).appendTo('select'); 
+0

Được đánh dấu là câu trả lời như đã được đăng đầu tiên .. cộng với bản trình diễn. Rực rỡ, cảm ơn bạn. – glosrob

+0

Dường như chất thải không được đăng sau khi làm việc trong khoảng 5 phút. – kei

+0

@glosrob cwolves thực sự đã đăng đầu tiên – kei

16
var sb = $('select'); 

sb.append(sb.find('option').sort(function(a, b){ 
    return (
     a = $(a).text(), 
     b = $(b).text(), 
     a == 'NA' ? 1 : b == 'NA' ? -1 : 0|a > b 
    ); 
})); 
1

Nếu bạn có nhiều hơn một lựa chọn trong trang (nhiều Selects) sử dụng này :

function NASort(a, b) { 
    if (a.innerHTML == 'NA') { 
     return 1; 
    } 
    else if (b.innerHTML == 'NA') { 
     return -1; 
    } 
    return (a.innerHTML > b.innerHTML) ? 1 : -1; 
}; 

$('select').each(function(index) { 
    $(this).find('option').sort(NASort).appendTo($(this)); 
}); 
1

Tôi đã thực hiện một số thay đổi đối với chức năng ban đầu và hoạt động tốt.

function NASort(a, b) { 
    console.log(a.innerHTML.substr(0, 1).toLowerCase() + ' > ' + b.innerHTML.substr(0, 1).toLowerCase()); 
    return (a.innerHTML.substr(0, 1).toLowerCase() > b.innerHTML.substr(0, 1).toLowerCase()) ? 1 : -1; 
}; 

$('select option').sort(NASort).appendTo('select'); 
Các vấn đề liên quan