3 回答
TA贡献1809条经验 获得超8个赞
我要做的是:
将每个文本和值提取<option>到对象数组中;
对数组排序;
<option>按顺序使用数组内容更新元素。
要使用jQuery,您可以执行以下操作:
var options = $('select.whatever option');
var arr = options.map(function(_, o) { return { t: $(o).text(), v: o.value }; }).get();
arr.sort(function(o1, o2) { return o1.t > o2.t ? 1 : o1.t < o2.t ? -1 : 0; });
options.each(function(i, o) {
o.value = arr[i].v;
$(o).text(arr[i].t);
});
这是一个工作的jsfiddle。
编辑 -如果要排序而忽略字母大小写,则可以在比较之前使用JavaScript .toUpperCase()或.toLowerCase()函数:
arr.sort(function(o1, o2) {
var t1 = o1.t.toLowerCase(), t2 = o2.t.toLowerCase();
return t1 > t2 ? 1 : t1 < t2 ? -1 : 0;
});
TA贡献1797条经验 获得超6个赞
接受的答案并非在所有情况下都是最好的,因为有时您希望保留选项和不同参数的类(例如data-foo)。
我的解决方案是:
var sel = $('#select_id');
var selected = sel.val(); // cache selected value, before reordering
var opts_list = sel.find('option');
opts_list.sort(function(a, b) { return $(a).text() > $(b).text() ? 1 : -1; });
sel.html('').append(opts_list);
sel.val(selected); // set cached selected value
//对于ie11或获得空白选项的用户,请替换html('')empty()
TA贡献1784条经验 获得超9个赞
<select id="mSelect" >
<option value="val1" > DEF </option>
<option value="val4" > GRT </option>
<option value="val2" > ABC </option>
<option value="val3" > OPL </option>
<option value="val5" > AWS </option>
<option value="val9" > BTY </option>
</select>
。
$("#mSelect").append($("#mSelect option").remove().sort(function(a, b) {
var at = $(a).text(), bt = $(b).text();
return (at > bt)?1:((at < bt)?-1:0);
}));
添加回答
举报