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.

Relaterade artiklar