How to order (sort) a <li> list with numeric content?
Asked Answered
P

6

8

I have a list as below that is created dynamically:

<ul>
  <li>20</li>
  <li>10</li>
  <li>5</li>
  <li>3</li>
  <li>32</li>
  <li>25</li>
  <li>6</li>
  <li>12</li>
  <li>8</li>
</ul>

Is it possible order this list using jQuery? I need it ordered from lower to bigger, like this:

<ul>
  <li>3</li>
  <li>5</li>
  <li>6</li>
  <li>8</li>
  <li>10</li>
  <li>12</li>
  <li>20</li>
  <li>25</li>
  <li>32</li>
</ul>
Placement answered 18/4, 2012 at 18:9 Comment(0)
E
9

Below should do the trick:

$(function() {
  $('button').click(function() {
    var liContents = [];
    $('ul li').each(function() {
      liContents.push(parseInt($(this).text(), 10));
    });
    liContents.sort(numOrdDesc);
    $('ul li').each(function() {
      $(this).text(liContents.pop());
    });
  });
});

function numOrdDesc(a, b) {
  return (b - a);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li>20</li>
  <li>10</li>
  <li>5</li>
  <li>3</li>
  <li>32</li>
  <li>25</li>
  <li>6</li>
  <li>12</li>
  <li>8</li>
</ul>

<button>Sort</button>
Erfurt answered 18/4, 2012 at 18:15 Comment(0)
T
9
var li = $('ul li');
li.sort(function(a, b) {
    if(parseInt($(a).text()) > parseInt($(b).text()))
        return 1;
    else return -1;
});
$('ul').empty().html(li);
Thaxter answered 18/4, 2012 at 18:24 Comment(0)
C
2

There are jQuery plugins to handle this as well. Check out TinySort

Chumley answered 18/4, 2012 at 18:16 Comment(0)
K
2

Here is a possible way to do it:

$(function() {
  var elems = $('ul').children('li').remove();
  elems.sort(function(a, b) {
    return parseInt($(a).text()) > parseInt($(b).text());
  });
  $('ul').append(elems);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li>20</li>
  <li>10</li>
  <li>5</li>
  <li>3</li>
  <li>32</li>
  <li>25</li>
  <li>6</li>
  <li>12</li>
  <li>8</li>
</ul>
Kinesiology answered 18/4, 2012 at 18:18 Comment(0)
M
1

You can do:

var listItems = [];
$("#list li").each(function() {
  console.log($(this).text());
  listItems.push(parseInt($(this).text()));
});

listItems.sort(function(a, b) {
  return a - b
});

$("#list").html("");
$.each(listItems, function(i, v) {
  $("#list").append($("<li>" + v + "</li>"));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul id="list">
  <li>20</li>
  <li>10</li>
  <li>5</li>
  <li>3</li>
  <li>32</li>
  <li>25</li>
  <li>6</li>
  <li>12</li>
  <li>8</li>
</ul>
Mandrill answered 18/4, 2012 at 18:32 Comment(0)
O
0

Using sortContent plugin ,everything will be easy,clean and ready for reuse :

 $('ul').sortContent({helper:myhelper});

Known that :

myhelper=function(e){
   return $('a',$(e)).attr('href');
}

DEMO


If you want to discover other options , visit Plugin HOMEPAGE

Opulent answered 6/7, 2014 at 7:43 Comment(1)
You should make it clear that you're the author of the plugin you're suggesting.Jaguar

© 2022 - 2024 — McMap. All rights reserved.