javascript - Hur kan jag sortera en lista alfabetiskt med jQuery?
Jag är lite över min förmåga här och jag hoppas att detta faktiskt är möjligt.
Jag skulle vilja kunna kalla på en funktion som sorterar alla objekt i min lista i alfabetisk ordning.
Jag har tittat igenom jQuery UI för sortering men det verkar inte vara det. Några tankar?
Svar #1
Något sådant här:
var mylist = $('#myUL');
var listitems = mylist.children('li').get();
listitems.sort(function(a, b) {
return $(a).text().toUpperCase().localeCompare($(b).text().toUpperCase());
})
$.each(listitems, function(idx, itm) { mylist.append(itm); });
Från denna sida: http://www.onemoretake.com/2009/02/25/sorting-elements-with-jquery/
Ovanstående kod kommer att sortera din oordnade lista med id 'myUL'.
ELLER så kan du använda ett plugin som TinySort. https://github.com/Sjeiti/TinySort
Svar #2
Du behöver inte jQuery för att göra detta...
function sortUnorderedList(ul, sortDescending) {
if(typeof ul == "string")
ul = document.getElementById(ul);
// Idiot-proof, remove if you want
if(!ul) {
alert("The UL object is null!");
return;
}
// Get the list items and setup an array for sorting
var lis = ul.getElementsByTagName("LI");
var vals = [];
// Populate the array
for(var i = 0, l = lis.length; i < l; i++)
vals.push(lis[i].innerHTML);
// Sort it
vals.sort();
// Sometimes you gotta DESC
if(sortDescending)
vals.reverse();
// Change the list on the page
for(var i = 0, l = lis.length; i < l; i++)
lis[i].innerHTML = vals[i];
}
Lätt att använda...
sortUnorderedList("ID_OF_LIST");
Live Demo →
Svar #3
$(".list li").sort(asc_sort).appendTo('.list');
//$("#debug").text("Output:");
// accending sort
function asc_sort(a, b){
return ($(b).text()) < ($(a).text()) ? 1 : -1;
}
// decending sort
function dec_sort(a, b){
return ($(b).text()) > ($(a).text()) ? 1 : -1;
}
live demo : http://jsbin.com/eculis/876/edit
Svar #4
För att detta ska fungera med alla webbläsare, inklusive Chrome, behöver du få callback-funktionen för sort() att returnera -1, 0 eller 1.
se http://inderpreetsingh.com/2010/12/01/chromes-javascript-sort-array-function-is-different-yet-proper/
function sortUL(selector) {
$(selector).children("li").sort(function(a, b) {
var upA = $(a).text().toUpperCase();
var upB = $(b).text().toUpperCase();
return (upA < upB) ? -1 : (upA > upB) ? 1 : 0;
}).appendTo(selector);
}
sortUL("ul.mylist");
Svar #5
Om du använder jQuery kan du göra så här:
$(function() {
var $list = $("#list");
$list.children().detach().sort(function(a, b) {
return $(a).text().localeCompare($(b).text());
}).appendTo($list);
});<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<ul id="list">
<li>delta</li>
<li>cat</li>
<li>alpha</li>
<li>cat</li>
<li>beta</li>
<li>gamma</li>
<li>gamma</li>
<li>alpha</li>
<li>cat</li>
<li>delta</li>
<li>bat</li>
<li>cat</li>
</ul>Observera att det är absolut fel att returnera 1 och -1 (eller 0 och 1) från jämförelsefunktionen.
