按值对 Html Select 的选项进行排序,同时保留当前所选项目的最有效方法是什么?

IT技术 javascript jquery arrays sorting html-select
2021-01-19 08:09:57

我有 jQuery,但我不确定它是否有任何内置的排序助手。我可以为每个项目的textvalueselected属性制作一个二维数组,但我认为内置的 javascriptArray.sort()不会正常工作。

6个回答

将选项提取到一个临时数组中,排序,然后重建列表:

var my_options = $("#my_select option");
var selected = $("#my_select").val();

my_options.sort(function(a,b) {
    if (a.text > b.text) return 1;
    if (a.text < b.text) return -1;
    return 0
})

$("#my_select").empty().append( my_options );
$("#my_select").val(selected);

Mozilla 的排序文档(特别是 compareFunction)和维基百科的排序算法页面是相关的。

如果您想让排序不区分大小写,请替换texttext.toLowerCase()

上面显示的排序函数说明了如何排序。准确地对非英语语言进行排序可能很复杂(请参阅unicode collat​​ion algorithm)。在 sort 函数中使用localeCompare是一个很好的解决方案,例如:

my_options.sort(function(a,b) {
    return a.text.localeCompare(b.text);
});
凉爽的。可以删除“其他”字样。无论如何返回结束功能。
2021-03-17 08:09:57
请注意,这是区分大小写的——也就是说,它会将所有以大写字母开头的内容排序在以小写字母开头的内容之前。如果这是不可取的,只需.toUpperCase()在每个之后添加.text
2021-03-29 08:09:57
此外,它不会在所有浏览器中按原样保留当前选择的选项(Chrome 记住了选择的内容,但 firefox 和 ie 没有,并在选项被读取后选择了最后一个元素)。要解决此问题,请在排序前保存当前选定的值,然后重新选择它。即,在做任何其他事情之前 var selected = $("#my_select").val(); ,然后在附加排序选项之后,恢复 val,即$("#my_select").val(selected);
2021-04-01 08:09:57
@TJEllis 关于区分大小写的问题,这个问题提供了更多信息,为什么在忽略案例时应该使用.toUpperCase()vs stackoverflow.com/questions/2140627/....toLowerCase()
2021-04-05 08:09:57
3 年后重新审视这个问题,这条路线似乎是正确的路要走
2021-04-14 08:09:57

稍微修改了上面汤姆的答案,以便它实际上修改要排序的选择框的内容,而不仅仅是返回已排序的元素。

$('#your_select_box').sort_select_box();

jQuery 函数:

$.fn.sort_select_box = function(){
    // Get options from select box
    var my_options = $("#" + this.attr('id') + ' option');
    // sort alphabetically
    my_options.sort(function(a,b) {
        if (a.text > b.text) return 1;
        else if (a.text < b.text) return -1;
        else return 0
    })
   //replace with sorted my_options;
   $(this).empty().append( my_options );

   // clearing any selections
   $("#"+this.attr('id')+" option").attr('selected', false);
}
这个答案接近顶部,但没有正确选择
2021-04-09 08:09:57

我刚刚在 jquery 函数中包装了 Mark 的想法

$('#your_select_box').sort_select_box();

jQuery 函数:

$.fn.sort_select_box = function(){
    var my_options = $("#" + this.attr('id') + ' option');
    my_options.sort(function(a,b) {
        if (a.text > b.text) return 1;
        else if (a.text < b.text) return -1;
        else return 0
    })
   return my_options;
}
我怎么能把它添加到我当前的点击事件中?$('#addwire').click(function() { return !$('#wireselection option:selected').remove().appendTo('#wires').sort_select_box(); }); 似乎不起作用
2021-04-12 08:09:57

我在对@Juan Perez 的评论中提到的解决方案

$.fn.sortOptions = function(){
    $(this).each(function(){
        var op = $(this).children("option");
        op.sort(function(a, b) {
            return a.text > b.text ? 1 : -1;
        })
        return $(this).empty().append(op);
    });
}

用法:

$("select").sortOptions();

这仍然可以改进,但我不需要添加更多的花里胡哨:)

好吧,在 IE6 中,它似乎对嵌套数组的 [0] 项进行排序:

function sortSelect(selectToSort) {
    var arrOptions = [];

    for (var i = 0; i < selectToSort.options.length; i++)  {
        arrOptions[i] = [];
        arrOptions[i][0] = selectToSort.options[i].value;
        arrOptions[i][1] = selectToSort.options[i].text;
        arrOptions[i][2] = selectToSort.options[i].selected;
    }

    arrOptions.sort();

    for (var i = 0; i < selectToSort.options.length; i++)  {
        selectToSort.options[i].value = arrOptions[i][0];
        selectToSort.options[i].text = arrOptions[i][1];
        selectToSort.options[i].selected = arrOptions[i][2];
    }
}

我会看看这是否适用于其他浏览器...

编辑:它也适用于 Firefox,哇哦!

还有比这更简单的方法吗?是否有一些内置于 javascript 或 jQuery 的方法可以对我缺少的选择进行排序,或者这是最好的方法?

请注意,此函数不会对选项元素进行排序它更改现有元素上[value,text,selected],以便对它们进行排序(在本例中是按值)。这对于大多数应用程序来说已经足够了,但是如果您有其他属性(CSS、工具提示等),那么这种方法就不够用了。
2021-03-27 08:09:57