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

bom*_*sen 68 html javascript sorting jquery

我试图按字母顺序理解option元素中的排序元素select.理想情况下,我想把它作为一个单独的函数,我可以传入select元素,因为当用户点击某些按钮时需要对它进行排序.

我一直在寻找一种很好的方法,但却找不到任何对我有用的东西.

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

这有可能吗?

Poi*_*nty 108

我要做的是:

  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);
});
Run Code Online (Sandbox Code Playgroud)

这是一个工作的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;
});
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答 - 几乎完全解决了我的问题.我只需要对其进行扩充,以便跟踪选定的选项.对于arr options.map,我添加了"s:$(o).attr('selected')",然后在options.each中只需添加:$(o).attr('selected',arr [i] .S); 谢谢! (5认同)
  • 这是修改后的代码,用于记住当前选择的选项:http://jsfiddle.net/trELD/700/ (3认同)

mar*_*xin 51

在所有情况下,接受的答案并不是最好的,因为有时你想要坚持选项类和不同的参数(例如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
Run Code Online (Sandbox Code Playgroud)

//对于ie11或获得空白选项的人,替换html('')empty()

  • 最佳答案.这是我的情况.我需要保留选项数据 (4认同)
  • 在最后一行中,您可以将sel.html('').append(opts_list)更改为sel.html(opts_list) (3认同)
  • 应该注意的是,它在 ie(11) 中不起作用:选项会丢失标签。我发现的最跨浏览器的解决方案是 [a jquery-less one](http://stackoverflow.com/a/1885355/2572988)。 (2认同)

Dio*_*ode 29

<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>
Run Code Online (Sandbox Code Playgroud)

.

$("#mSelect").append($("#mSelect option").remove().sort(function(a, b) {
    var at = $(a).text(), bt = $(b).text();
    return (at > bt)?1:((at < bt)?-1:0);
}));
Run Code Online (Sandbox Code Playgroud)

  • 我使用上面的内容,改为:var at = $(a).text().toLowerCase(),bt = $(b).text().toLowerCase(); 使分拣案件独立 (4认同)
  • `$("#mSelect").append($ options);`应该足够了:) (2认同)

Ger*_*bus 25

HTML:

<select id="list">
    <option value="op3">option 3</option>
    <option value="op1">option 1</option>
    <option value="op2">option 2</option>
</select>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

  • 几乎完美,但Chrome和Firefox会显示最后选择的选项。 (2认同)

小智 7

我知道这个话题很老,但我认为我的回答对很多人都有用。

这是使用 ES6根据Pointy的回答制作的 jQuery 插件:

/**
 * Sort values alphabetically in select
 * source: http://stackoverflow.com/questions/12073270/sorting-options-elements-alphabetically-using-jquery
 */
$.fn.extend({
    sortSelect() {
        let options = this.find("option"),
            arr = options.map(function(_, o) { return { t: $(o).text(), v: o.value }; }).get();

        arr.sort((o1, o2) => { // sort select
            let t1 = o1.t.toLowerCase(), 
                t2 = o2.t.toLowerCase();
            return t1 > t2 ? 1 : t1 < t2 ? -1 : 0;
        });

        options.each((i, o) => {
            o.value = arr[i].v;
            $(o).text(arr[i].t);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

使用非常简单

$("select").sortSelect();
Run Code Online (Sandbox Code Playgroud)


小智 6

这是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);
        }
    }); 
}
Run Code Online (Sandbox Code Playgroud)

该函数具有skip_first参数,当您要将第一个选项保持在顶部时(例如,在“选择以下位置:”时),该参数很有用。

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

用法示例:

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

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

});
Run Code Online (Sandbox Code Playgroud)