如何在jQuery中使用自定义排序顺序对列表项进行排序

How to sort list items using custom sort order in jQuery

本文关键字:排序 顺序 列表 自定义 jQuery      更新时间:2023-09-26

我的问题与我在Stack Overflow上发现的许多其他问题非常相似,但不完全相同。

我想根据每个项目中包含的跨度的内容对列表项目进行排序,但要使用我可以定义的排序顺序。以下是示例列表项的HTML:

<li>
    <span class="fname">John</span>
    <span class="lname">Doe</span>
    <span class="year">Sophomore</span>
</li>

我想根据"年"跨度的内容进行排序,但要按时间顺序而不是按字母顺序。显然,订单必须是:

  • 大一新生
  • 大二学生
  • Junior
  • 高级

我该怎么做?

仅供参考,我使用以下jQuery代码(非常有效(按姓氏字母顺序排序:

function sortByLastName(){
    var myList = $('#foo ul');
    var listItems = myList.children('li').get();
    listItems.sort(function(a,b){
        var compA = $(a).find('.lname').text().toUpperCase();
        var compB = $(b).find('.lname').text().toUpperCase();
        return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
    });
    $(myList).append(listItems);
};

要匹配sortByLastName((函数,这将起作用:

function sortByYear(){
  var myYears = ['Freshman', 'Sophomore', 'Junior', 'Senior'];
  var myList = $('#foo ul');
  var listItems = myList.children('li').get();
  listItems.sort(function(a,b){
    var compA = $.inArray($(a).find('.year').text(), myYears);
    var compB = $.inArray($(b).find('.year').text(), myYears);
    return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
  });
  $(myList).append(listItems);
}

只需使用$.inArray((在数组中查找每个学年的索引。请注意,对于在数组中找不到的值,这将返回-1,这将把这些元素放在列表的顶部。

一个简单的方法是创建一个具有期望值的数组。

var years=['Freshman', 'Sophomore', 'Junior', 'Senior' ];

然后在对元素进行排序时,比较索引。

listItems.sort(function(a,b){
    var indexA = $.inArray(  $(a).find('.year').text(), years );
    var indexB = $.inArray( $(b).find('.year').text(), years );
    return ( indexA < indexB) ? -1 : ( indexA > indexB) ? 1 : 0;
});

您必须更改排序标准回调。像这样:

function sortByLastName(){
    var myList = $('#foo ul');
    var listItems = myList.children('li').get();
    var scores = {
       "FRESHMAN": 0, "SOPHOMORE": 1, "JUNIOR": 2, "SENIOR": 3
    };
    listItems.sort(function(a,b){
        var compA = $(a).find('.lname').text().toUpperCase();
        var compB = $(b).find('.lname').text().toUpperCase();
        compA = scores[compA]; compB = scores[compB]; //Sort by scores instead of values
        return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
    });
    $(myList).append(listItems);
};

希望这能帮助