I have a select box on a form, which carries an incremental rel attribute.
I have a function that can sort the options by thier .text() value, into alphabetcal order.
My question is, with jQuery, how do i sort in an ascending order using the rel attribute ?
<option rel="1" value="ASHCHRC">Ashchurch for Tewkesbury </option>
<option rel="2" value="EVESHAM">Evesham </option>
<option rel="3" value="CHLTNHM">Cheltenham Spa </option>
<option rel="4" value="PERSHOR">Pershore </option>
<option rel="5" value="HONYBRN">Honeybourne </option>
<option rel="6" value="MINMARS">Moreton-in-Marsh </option>
<option rel="7" value="GLOSTER">Gloucester </option>
<option rel="8" value="GTMLVRN">Great Malvern </option>
<option rel="9" value="MLVRNLK">Malvern Link </option>
my sort function: var object; can be one of many select boxes throughout the form.
$(object).each(function() {
// Keep track of the selected option.
var selectedValue = $(this).val();
// sort it out
$(this).html($("option", $(this)).sort(function(a, b) {
return a.text == b.text ? 0 : a.text < b.text ? -1 : 1
}));
// Select one option.
$(this).val(selectedValue);
});
If you want to sort by rel you should change your function
$(this).html($("option", $(this)).sort(function(a, b) {
var arel = $(a).attr('rel');
var brel = $(b).attr('rel');
return arel == brel ? 0 : arel < brel ? -1 : 1
}));
edit with parseInt()
$(this).html($("option", $(this)).sort(function(a, b) {
var arel = parseInt($(a).attr('rel'), 10);
var brel = parseInt($(b).attr('rel'), 10);
return arel == brel ? 0 : arel < brel ? -1 : 1
}));
For future reference, the accepted answer is not complete if option
has data or props (e.g. .prop('selected', true)
). They will be removed after using .html()
.
The function below is probably not optimized but it's correctly working :
$.fn.sortChildren = function(selector, sortFunc) {
$(this)
.children(selector)
.detach()
.sort(sortFunc)
.appendTo($(this));
};
$('select').sortChildren('option', function(a, b) {
// sort impl
});
You can use the .attr() function to get the value of an attribute in jQuery. See http://api.jquery.com/attr/ for more info.
Try this:
$(object).each(function() {
// Keep track of the selected option.
var selectedValue = $(this).val();
// sort it out
$(this).html($("option", $(this)).sort(function(a, b) {
var aRel = $(a).attr("rel");
var bRel = $(b).attr("rel");
return aRel == bRel ? 0 : aRel < bRel ? -1 : 1
}));
// Select one option.
$(this).val(selectedValue);
});
Try this.
$(document).ready(function()
{
var myarray=new Array();
$("select option").each(function()
{
myarray.push({value:this.value, optiontext:$(this).text()});
});
myarray.sort(sortfun);
$newHmtl="";
for(var i=0;i<myarray.length;i++)
{
$newHmtl+="<option rel='1' value='"+myarray[i]['value']+"'>"+myarray[i]['optiontext']+"</option>";
}
$("select").html($newHmtl);
});
function sortfun(a,b)
{
a = a['value'];
b = b['value'];
return a == b ? 0 : (a < b ? -1 : 1)
}
I needed a similar solution then made some changes to the original function and it worked fine.
function NASort(a, b) {
return (a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase()) ? 1 : -1;
};
$('select option').sort(NASort).appendTo('select');