I\'m trying to sort an li
elements and get an unexpacted result
I need to sort it three times to get it correctly,
where have I mistaken? javascript
There are much better ways to sort.
localeCompare()
is such a comparison function. "#table1"
is a more efficient selector than "ol#table1"
.I would suggest this:
$("div#btn").click(function() {
var sort_by_name = function(a, b) {
return a.innerHTML.toLowerCase().localeCompare(b.innerHTML.toLowerCase());
}
var list = $("#table1 > li").get();
list.sort(sort_by_name);
for (var i = 0; i < list.length; i++) {
list[i].parentNode.appendChild(list[i]);
}
});
Which you can see work here: http://jsfiddle.net/jfriend00/yqd3w/
var sort_by_name = function(a, b) {
return $(a).text().toLowerCase().localeCompare($(b).text().toLowerCase());
}
You can use localeCompare instead to make things more elegant and workable.
See jsfiddle http://jsfiddle.net/Qww87/11/
according to documentation it needs numeric values. more intelligible:
var sort_by_name = function(a, b) {
if(a.innerHTML.toLowerCase() < b.innerHTML.toLowerCase()) return -1;
if(a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase()) return 1;
return 0;
}
A custom compareFunction needs to return -1, 0 or 1.
function sort_by_name(a, b) {
var sa = a.innerHTML.toLowerCase(), sb = b.innerHTML.toLowerCase();
return sb<sa ? -1 : sb>sa ? 1 : 0;
}
Use my jquery plugin Sort Content :
$('ol#table1').sortContent({asc:true})
That's it!
DEMO : http://jsfiddle.net/abdennour/SjWXU/