如何使用 jQuery 按字母顺序对列表进行排序?

IT技术 javascript jquery dom sorting
2021-02-01 07:27:56

我在这里有点超出我的深度,我希望这实际上是可能的。

我希望能够调用一个函数来按字母顺序对列表中的所有项目进行排序。

我一直在浏览 jQuery UI 进行排序,但似乎并非如此。有什么想法吗?

6个回答

像这样的东西:

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); });

从这个页面:http : //www.onemoretake.com/2009/02/25/sorting-elements-with-jquery/

上面的代码将使用 id 'myUL' 对您的无序列表进行排序。

或者你可以使用像 TinySort 这样的插件。https://github.com/Sjeiti/TinySort

HL Menken 有一句话描述了这个解决方案:“对于每个问题,都有一个简单、优雅和错误的解决方案。” 这个过程在 O(n^2) 时间内运行。相对较短的列表并不明显,但在包含 100 多个元素的列表中,完成排序需要 3-4 秒。
2021-03-12 07:27:56
有些东西可以优雅而有趣地观看,但仍然失败。优雅并不意味着成功。
2021-03-16 07:27:56
最后一行可以替换为 $(listitems).appendTo(mylist); ?
2021-03-19 07:27:56
这个解决方案没有错。它回答了这个问题。OP 没有指定他需要对超过 100 个项目的列表进行排序。如果他的列表永远不会超过 100 个项目,那么这个解决方案是完全可以接受的。+1 表示解决方案很慢,-1 表示将满足要求的解决方案声明为“错误”。
2021-03-21 07:27:56
@Nathan:关于“对于每个问题,都有一个简单、优雅和错误的解决方案。” - 好吧,错误的解决方案并不优雅。
2021-04-05 07:27:56

不会需要jQuery来做到这一点...

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];
}

便于使用...

sortUnorderedList("ID_OF_LIST");

现场演示 →

恕我直言,这是一个可怕的答案。完全可以重新排列 DOM 节点,而无需对其进行序列化和反序列化,也无需破坏任何附加的属性和/或事件。
2021-03-26 07:27:56
Buhuuu 内部HTML !不要用那个。这是 Microsoft 专有的东西,W3C 从未承认过。
2021-03-30 07:27:56
使用innerHTML 移动元素是一个糟糕的解决方案,因为排序后它们不是相同的元素。对元素的所有现有引用都将丢失。从 JavaScript 绑定的所有事件侦听器都将丢失。最好存储元素而不是 innerHTML,使用排序函数 (vals.sort(function(a, b) {return b.innerHTML < a.innerHTML;})) 和 appendChild 移动元素。
2021-04-04 07:27:56
...但如果你要使用 jQuery,你会怎么做?
2021-04-08 07:27:56
我用这种方法发现的一个问题是,因为它只是移动的文本,如果在排序之前使用 jQuery.data 将数据关联到 DOM 节点,那么这些关联现在在排序后指向错误的节点。
2021-04-09 07:27:56
$(".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;    
}

现场演示:http : //jsbin.com/eculis/876/edit

不幸的是,此解决方案在 IE 中不起作用,而下面的 PatrickHecks 回答适用于所有浏览器。
2021-03-11 07:27:56
@DougDomeny 是对的。$(".list").children()如果可能,最好调用,或者设置具有直接子关系的选择器,例如$(".list > li")
2021-03-11 07:27:56
小心选择器!“.list li”将选择所有后代 LI 标签,而不仅仅是直接的孩子。
2021-03-20 07:27:56
这是最好的答案。我什至喜欢这样的一行:$(".list li").sort(function(a, b){return ($(b).text()) < ($(a).text());}).appendTo('.list');. 一句话:.text()应该是.text().toUpperCase()
2021-04-01 07:27:56
顺便说一句,这是我使用此答案制作的小提琴的链接。我将代码设置为多合一功能: jsfiddle.net/mroncetwice/t0whh6fL
2021-04-01 07:27:56

为了使这项工作适用于包括 Chrome 在内的所有浏览器,您需要使 sort() 的回调函数返回 -1,0 或 1。

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");
@DougDomeny,为什么不需要显式删除 li 元素?
2021-03-14 07:27:56
在附加排序的 li 元素之前,不应该从 ul.myList 中删除所有 li 元素吗?
2021-03-25 07:27:56
使用 .localeCompare 将是对非 ASCII 字符的改进。
2021-03-25 07:27:56
@bowserm,appendTo 方法移动 DOM 元素而不是复制它们。
2021-03-25 07:27:56
@Daud,不需要显式删除 LI 元素。
2021-04-05 07:27:56

如果你使用 jQuery,你可以这样做:

$(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>

请注意,从比较函数返回 1 和 -1(或 0 和 1)是绝对错误的

这绝对是太棒了,太棒了,太棒了!!
2021-03-26 07:27:56