使用模数按字母顺序对列表进行排序

S16*_*S16 8 javascript sorting jquery modulus

我在抓取元素列表并按字母顺序对它们进行排序时没有任何问题,但我很难理解如何使用模数进行排序.

###更新###

这是代码工作'我的方式',但是,我更喜欢下面提供的答案的可重用性,所以已经接受了答案.

<script type="text/javascript">
$(document).ready( function() {
    $('.sectionList2').each( function() {
        var oldList = $('li a', this),
            columns = 4,
            newList = [];
        for( var start = 0; start < columns; start++){
            for( var i = start; i < oldList.length; i += columns){
                newList.push('<li><a href="' + oldList[i].href + '">' + $(oldList[i]).text() + '</a></li>');
            }
        }
        $(this).html(newList.join(''));
    });
});
</script>
Run Code Online (Sandbox Code Playgroud)

例如.说我有以下无序列表:

<ul>
    <li><a href="~">Boots</a></li>
    <li><a href="~">Eyewear</a></li>
    <li><a href="~">Gloves</a></li>
    <li><a href="~">Heated Gear</a></li>
    <li><a href="~">Helmet Accessories</a></li>
    <li><a href="~">Helmets</a></li>
    <li><a href="~">Jackets</a></li>
    <li><a href="~">Mechanic's Wear</a></li>
    <li><a href="~">Pants</a></li>
    <li><a href="~">Protection</a></li>
    <li><a href="~">Rainwear</a></li>
    <li><a href="~">Random Apparel</a></li>
    <li><a href="~">Riding Suits</a></li>
    <li><a href="~">Riding Underwear</a></li>
    <li><a href="~">Socks</a></li>
    <li><a href="~">Vests</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我将此列表设置为显示在4列中,每个列都向右浮动.在视觉上这使得在较大列表中查找项目变得困难.我需要的输出是这样的:

<ul>
    <li><a href="~">Boots</a></li>
    <li><a href="~">Helmet Accessories</a></li>
    <li><a href="~">Pants</a></li>
    <li><a href="~">Riding Suits</a></li>
    <li><a href="~">Eyewear</a></li>
    <li><a href="~">Helmets</a></li>
    <li><a href="~">Protection</a></li>
    <li><a href="~">Riding Underwear</a></li>
    <li><a href="~">Gloves</a></li>
    <li><a href="~">Jackets</a></li>
    <li><a href="~">Rainwear</a></li>
    <li><a href="~">Socks</a></li>
    <li><a href="~">Heated Gear</a></li>
    <li><a href="~">Mechanic's Wear</a></li>
    <li><a href="~">Random Apparel</a></li>
    <li><a href="~">Vests</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一个函数,我可以传递我的列表项数组,并返回我的数组,按字母顺序排序,选择模数; 在这种情况下4.

任何帮助将不胜感激,因为我找不到有关该主题的文档.

gil*_*ly3 2

  1. 按字母顺序排列你的清单。对于您的情况,这已经完成,但如果没有:

    function alphabetizeElements(a, b)
    {
        var aText = $(a).text();
        var bText = $(b).text();
        return aText > bText ? 1 : aText < bText ? -1 : 0;
    }
    var alphabetizedList = $("#myList li").sort(alphabetizeElements);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 存储每个元素的按字母顺序排列的索引:

    $.each(alphabetizedList, function(i)
    {
        $(this).data("alphaIndex", i);
    });
    
    Run Code Online (Sandbox Code Playgroud)
  3. 首先按模数对按字母顺序排列的列表进行排序,然后按索引排序:

    function listColumnSortFn(columns)
    {
        return function(a, b)
        {
            var aIndex = $(a).data("alphaIndex");
            var bIndex = $(b).data("alphaIndex");
            return ((aIndex % columns) - (bIndex % columns)) || (aIndex - bIndex);
        }
    }
    var columnSortedList = alphabetizedList.sort(listColumnSortFn(4));
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将列表元素替换为已排序的元素:

    $("#myList li").remove();
    $("#myList").append(columnSortedList);
    
    Run Code Online (Sandbox Code Playgroud)

这是整个事情的全部:

function sortList(columns)
{
    var alphabetizedList = $("#myList li").sort(alphabetizeElements);
    $.each(alphabetizedList, function(i)
    {
        $(this).data("alphaIndex", i);
    });
    var columnSortedList = alphabetizedList.sort(listColumnSortFn(columns));
    $("#myList li").remove();
    $("#myList").append(columnSortedList);
}
function alphabetizeElements(a, b)
{
    var aText = $(a).text();
    var bText = $(b).text();
    return aText > bText ? 1 : aText < bText ? -1 : 0;
}
function listColumnSortFn(columns)
{
    return function(a, b)
    {
        var aIndex = $(a).data("alphaIndex");
        var bIndex = $(b).data("alphaIndex");
        return ((aIndex % columns) - (bIndex % columns)) || (aIndex - bIndex);
    }
}
$(function()
{
    sortList(4);
});
Run Code Online (Sandbox Code Playgroud)