使用 jQuery 按字母顺序对选项元素进行排序

IT技术 javascript jquery html sorting
2021-01-19 06:11:19

我正在尝试按字母顺序理解option元素内的排序元素select理想情况下,我希望将其作为一个单独的函数,我可以在其中传入 select 元素,因为当用户单击某些按钮时需要对其进行排序。

我已经四处寻找这样做的好方法,但一直找不到任何对我有用的东西。

选项元素应该按文本的字母顺序排序,而不是值。

这在某种程度上可能吗?

6个回答

我要做的是:

  1. 将每个的文本和值提取<option>到一个对象数组中;
  2. 对数组进行排序;
  3. <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;
});
是的,因为 JS 排序时大写字符的权重高于小写字符......所以看起来 ;-) 再次感谢,就像一个魅力!
2021-03-13 06:11:19
这是记住当前选择的选项的修改后的代码:jsfiddle.net/trELD/700
2021-04-02 06:11:19
感谢您的回答 - 几乎完全解决了我的问题。我只需要增加它以说明跟踪所选选项。对于 arr options.map 我添加了“s: $(o).attr('selected')”,然后在 options.each 中只需要添加: $(o).attr('selected', arr[i] .s); 谢谢!
2021-04-06 06:11:19
啊好吧,如果你想忽略字母大小写,那么是的。很高兴它奏效了!
2021-04-09 06:11:19
这为我做到了!只需要将所有 > 和 < 检查为大写 :-) 非常感谢!
2021-04-11 06:11:19

接受的答案并非在所有情况下都是最好的,因为有时您希望保留选项类别和不同的参数(例如 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()

最佳答案。这是我的情况。我需要保留选项数据属性
2021-03-31 06:11:19
这应该是选定的答案!这比上面简单得多,并且保留了任何类或数据属性。
2021-03-31 06:11:19
应该注意的是,它在 ie(11) 中不起作用:选项会丢失标签。我发现的最跨浏览器的解决方案是一个无 jquery 的解决方案
2021-04-02 06:11:19
在最后一行中,您可以将 sel.html('').append(opts_list) 更改为简单的 sel.html(opts_list)
2021-04-07 06:11:19
简单而简化的答案。
2021-04-09 06:11:19

html:

<select id="list">
    <option value="op3">option 3</option>
    <option value="op1">option 1</option>
    <option value="op2">option 2</option>
</select>

jQuery:

var options = $("#list option");                    // Collect options         
options.detach().sort(function(a,b) {               // Detach from select, then Sort
    var at = $(a).text();
    var bt = $(b).text();         
    return (at > bt)?1:((at < bt)?-1:0);            // Tell the sort function how to order
});
options.appendTo("#list");                          // Re-attach to select

我使用了 tracevipin 的解决方案,效果非常好。我在这里为像我这样喜欢找到易于阅读的代码并理解对其进行压缩的任何人提供了一个稍微修改的版本我还使用了.detach而不是.remove保留选项 DOM 元素上的任何绑定。

也非常适合我。
2021-03-16 06:11:19
这是 IMO 的最佳解决方案,与我将要发布的内容非常相似,因为它保留了元素的状态(即使是多项选择)。
2021-03-19 06:11:19
几乎完美,但 Chrome 和 Firefox 将最后一个选项显示为选中状态。
2021-03-29 06:11:19
完美地为我工作
2021-03-31 06:11:19
要修复 Chrome 和 Firefox 最后选择的选项,只需在此答案的开头和结尾使用此代码跟踪原始值var original = $("#list").val(); //first line $("#list").val(original); //last line
2021-04-12 06:11:19
<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);
}));
$("#mSelect").append($options); 应该足够了:)
2021-03-23 06:11:19
回调.sort()应返回一个小于零、零或更大的数字,以反映排序关系。我认为返回布尔值不会真正起作用。
2021-03-30 06:11:19
我按照上面的,改为: var at = $(a)​​.text().toLowerCase(), bt = $(b).text().toLowerCase(); 使排序案例独立
2021-04-04 06:11:19

这是我改进的Pointy 解决方案版本

function sortSelectOptions(selector, skip_first) {
    var options = (skip_first) ? $(selector + ' option:not(:first)') : $(selector + ' option');
    var arr = options.map(function(_, o) { return { t: $(o).text(), v: o.value, s: $(o).prop('selected') }; }).get();
    arr.sort(function(o1, o2) {
      var t1 = o1.t.toLowerCase(), t2 = o2.t.toLowerCase();
      return t1 > t2 ? 1 : t1 < t2 ? -1 : 0;
    }); 
    options.each(function(i, o) {
        o.value = arr[i].v;
        $(o).text(arr[i].t);
        if (arr[i].s) {
            $(o).attr('selected', 'selected').prop('selected', true);
        } else {
            $(o).removeAttr('selected');
            $(o).prop('selected', false);
        }
    }); 
}

该函数具有skip_first参数,当您想将第一个选项保留在顶部时很有用,例如当它是“选择下面:”时。

它还跟踪先前选择的选项。

用法示例:

jQuery(document).ready(function($) {

  sortSelectOptions('#select-id', true);

});