jQueryを使用していますが、ソートヘルパーが組み込まれているかどうかはわかりません。私は、各項目のの2次元配列にすることができtext
、value
およびselected
プロパティを、私はに建てられたJavaScriptのはないと思いますArray.sort()
正常に動作します。
回答:
オプションを一時配列に抽出し、並べ替えてから、リストを再構築します。
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)とWikipediaのソートアルゴリズムページが関連しています。
あなたは小文字を区別しないソートケースを作りたい場合は、交換するtext
とtext.toLowerCase()
上記の並べ替え関数は、並べ替えの方法を示しています。英語以外の言語を正確にソートすることは複雑になる可能性があります(Unicode照合アルゴリズムを参照)。sort関数でlocaleCompareを使用することは、良い解決策です。例:
my_options.sort(function(a,b) {
return a.text.localeCompare(b.text);
});
.toUpperCase()
それぞれの後にを追加してください.text
var selected = $("#my_select").val();
に、ソートされたオプションが追加された後、値を復元します。つまり、$("#my_select").val(selected);
.toUpperCase()
対.toLowerCase()
無視する場合は、ときstackoverflow.com/questions/2140627/...
上記のトムの回答をわずかに変更して、並べ替えられた要素を返すだけでなく、並べ替えられる選択ボックスの内容を実際に変更するようにしました。
$('#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);
}
Markのアイデアをjquery関数でラップしました
$('#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;
}
@JuanPerezへのコメントで言及した解決策
$.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に組み込まれているメソッドはありますか、それともこれが最善の方法ですか?
あります、閉じたjQueryのチケット動作するはずソートのためには、ちょうどコアに含まれていませんでした。
jQuery.fn.sort = function() {
return this.pushStack( [].sort.apply( this, arguments ), []);
};
グーグルグループのスレッドから参照されているので、ソートに使用される関数を渡すだけだと思います。
function sortSelect(selectToSort) {
jQuery(selectToSort.options).sort(function(a,b){
return a.value > b.value ? 1 : -1;
});
}
それが役に立てば幸い!
これはより良い解決策です。グローバル関数を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();
$(this)
代わりに使用する必要がありますthis
注意:コンテキストセレクターを使用する場合は、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();
少し遅れましたが、その価値のために、一般的に含めることができるより複雑な関数を実装しました。さまざまな出力のためのいくつかのオプションがあります。また<OPTGROUP>
、ラベルに基づいてタグに再帰することもできます。
$.fn.sortSelect = function(options){
const OPTIONS_DEFAULT = {
recursive: true, // Recurse into <optgroup>
reverse: false, // Reverse order
useValues: false, // Use values instead of text for <option> (<optgruop> is always label based)
blankFirst: true, // Force placeholder <option> with empty value first, ignores reverse
}
if (typeof options != "object" || null === options) {
options = OPTIONS_DEFAULT;
}
var sortOptions = function($root, $node, options){
if ($node.length != 1) {
return false;
}
if ($node[0].tagName != "SELECT" && $node[0].tagName != "OPTGROUP") {
return false;
}
if (options.recursive) {
$node.children('optgroup').each(function(k, v){
return sortOptions($root, $(v), options);
});
}
var $options = $node.children('option, optgroup');
var $optionsSorted = $options.sort(function(a, b){
if (options.blankFirst) {
if (a.tagName == "OPTION" && a.value == "") {
return -1;
}
if (b.tagName == "OPTION" && b.value == "") {
return 1;
}
}
var textA = (a.tagName == "OPTION" ? (options.useValues ? a.value : a.text) : a.label);
var textB = (b.tagName == "OPTION" ? (options.useValues ? a.value : b.text) : b.label);
if (textA > textB) {
return options.reverse ? -1 : 1;
}
if (textA < textB) {
return options.reverse ? 1 : -1;
}
return 0;
});
$options.remove();
$optionsSorted.appendTo($node);
return true;
};
var selected = $(this).val();
var sorted = sortOptions($(this), $(this), {...OPTIONS_DEFAULT, ...options});
$(this).val(selected);
return sorted;
};
次にsortSelect()
、任意の<SELECT>
タグで関数を呼び出すか、1つ<OPTGROUP>
だけでグループのオプションのみを並べ替えることができます。
例:
$('select').sortSelect();
「逆」オプションを使用した逆順:
$('select').sortSelect({
reverse: true
});
これをすべての選択に自動的に適用できます。おそらく、次のような重要なクラス( "js-sort"など)が含まれている場合に限ります。
$('select.js-sort').each(function(k, v){
$(v).sortSelect();
});