Это перекомпиляция моих 3 любимых ответов на этом форуме:
- Лучший и самый простой ответ Джока.
- Простой метод jQuery Терри Портера.
- Настраиваемая функция SmokeyPHP.
Результаты представляют собой простую в использовании и легко настраиваемую функцию.
Первый аргумент может быть объектом выбора, идентификатором объекта выбора или массивом как минимум с 2 измерениями.
Второй аргумент не обязателен. По умолчанию используется сортировка по тексту опции, индекс 0. Может быть передан любой другой индекс, поэтому сортируйте по нему. Может быть передано 1 или текст «значение», чтобы отсортировать по значению.
Сортировка по текстовым примерам (все будут отсортированы по тексту):
sortSelect('select_object_id');
sortSelect('select_object_id', 0);
sortSelect(selectObject);
sortSelect(selectObject, 0);
Сортировка по значению (все будут отсортированы по значению):
sortSelect('select_object_id', 'value');
sortSelect('select_object_id', 1);
sortSelect(selectObject, 1);
Сортировка любого массива по другому индексу:
var myArray = [
['ignored0', 'ignored1', 'Z-sortme2'],
['ignored0', 'ignored1', 'A-sortme2'],
['ignored0', 'ignored1', 'C-sortme2'],
];
sortSelect(myArray,2);
Последний сортирует массив по индексу-2, по сортировке.
Основная функция сортировки
function sortSelect(selElem, sortVal) {
// Checks for an object or string. Uses string as ID.
switch(typeof selElem) {
case "string":
selElem = document.getElementById(selElem);
break;
case "object":
if(selElem==null) return false;
break;
default:
return false;
}
// Builds the options list.
var tmpAry = new Array();
for (var i=0;i<selElem.options.length;i++) {
tmpAry[i] = new Array();
tmpAry[i][0] = selElem.options[i].text;
tmpAry[i][1] = selElem.options[i].value;
}
// allows sortVal to be optional, defaults to text.
switch(sortVal) {
case "value": // sort by value
sortVal = 1;
break;
default: // sort by text
sortVal = 0;
}
tmpAry.sort(function(a, b) {
return a[sortVal] == b[sortVal] ? 0 : a[sortVal] < b[sortVal] ? -1 : 1;
});
// removes all options from the select.
while (selElem.options.length > 0) {
selElem.options[0] = null;
}
// recreates all options with the new order.
for (var i=0;i<tmpAry.length;i++) {
var op = new Option(tmpAry[i][0], tmpAry[i][1]);
selElem.options[i] = op;
}
return true;
}