什么是最有效的方法来按值sortingHtml Select的选项,同时保留当前select的项目?

我有jQuery,但我不确定是否有任何内置的sorting助手。 我可以做一个每个项目的textvalueselected属性的二维数组,但我不认为在Array.sort()构build的JavaScript将正常工作。

将选项提取到临时数组中,进行sorting,然后重build列表:

 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的sorting文档 (特别是compareFunction)和维基百科的Sorting Algorithm页面是相关的。

如果要使sorting不区分大小写,请用text.toLowerCase()replacetext

上面显示的sortingfunction说明了如何sorting。 准确地排列非英语语言可能会很复杂(请参阅unicodesortingalgorithm )。 在sortingfunction中使用localeCompare是一个很好的解决scheme,例如:

 my_options.sort(function(a,b) { return a.text.localeCompare(b.text); }); 

稍微修改了Tom的答案,以便它实际上修改了要sorting的select框的内容,而不仅仅是返回sorting后的元素。

 $('#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); } 

我只是用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; } 

我在@Juan Perez的评论中提到的解决scheme

 $.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(); 

这仍然可以改善,但我不需要添加任何更多的钟声或口哨:)

有一个封闭的jQuery票据应该工作,但只是没有包括在核心。

 jQuery.fn.sort = function() { return this.pushStack( [].sort.apply( this, arguments ), []); }; 

从Google Groups的线程引用,我认为你只是传递一个用来sorting的函数,像这样

 function sortSelect(selectToSort) { jQuery(selectToSort.options).sort(function(a,b){ return a.value > b.value ? 1 : -1; }); } 

希望它有帮助!

那么,在IE6中,它似乎sorting在嵌套数组的[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或jQuerysortingselect我缺less,或者这是最好的方法?

这是一个更好的解决scheme。 向JQuery声明一个全局函数

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

并从代码中调用该函数。

 $("#my_select").sortSelect(); 

Array.sort()默认将每个元素转换为一个string,然后比较这些值。 所以["value", "text", "selected"]被sorting为"value, text, selected" 。 在大多数情况下,这可能会工作得很好。

如果你想单独对值进行sorting,或者将值解释为数字,那么你可以将一个比较函数传递给sort():

 arrOptions.sort(function(a,b) { return new Number(a[0]) - new Number(b[0]); }); 

记住:如果你想使用上下文select器,只是连接ID将无法正常工作

 $.fn.sort_select_box = function(){ var my_options = $("option", $(this)); my_options.sort(function(a,b) { if (a.text > b.text) return 1; else if (a.text < b.text) return -1; else return 0 }); $(this).empty().append(my_options); } // Usando: $("select#ProdutoFornecedorId", $($context)).sort_select_box(); 
 var arrOptions = []; var i = 0; sel.find("option").each(function(){ arrOptions[i] = []; arrOptions[i][0] = jQuery(this).text(); arrOptions[i][1] = jQuery(this); i += 1; }); arrOptions.sort(); for(var i=0;i<arrOptions.length;i++){ sel.append(arrOptions[i][1]); }