基于数据属性值的jquery排序列表

Mar*_*ace 36 jquery

鉴于以下列表

<ul class="listitems">
    <li data-position="1">Item 1</li>
    <li data-position="2">Item 2</li>
    <li data-position="3">Item 3</li>
    <li data-position="4">Item 4</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

页面上有一些功能可以让这些项目改变位置.例如,他们可能会达到以下状态(仅限示例,订单可以是任何内容):

<ul class="listitems">
    <li data-position="3">Item 3</li>
    <li data-position="2">Item 2</li>
    <li data-position="1">Item 1</li>
    <li data-position="4">Item 4</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个小功能来重置订单.到目前为止,我有以下内容:

function setPositions()
{
    $( '.listitems li' ).each(function() {
        var position = $(this).data('position');
        $(this).siblings().eq(position+1).after(this);
    });
}
Run Code Online (Sandbox Code Playgroud)

但它没有正常工作.我究竟做错了什么?

另外一个条件是列表的顺序可能没有改变,因此该函数也必须在该场景中工作.

Roh*_*mar 101

尝试使用sort()appendTo(),

$(".listitems li").sort(sort_li) // sort elements
                  .appendTo('.listitems'); // append again to the list
// sort function callback
function sort_li(a, b){
    return ($(b).data('position')) < ($(a).data('position')) ? 1 : -1;    
}
Run Code Online (Sandbox Code Playgroud)

片段中,

$(function() {
  $(".listitems li").sort(sort_li).appendTo('.listitems');
  function sort_li(a, b) {
    return ($(b).data('position')) < ($(a).data('position')) ? 1 : -1;
  }
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<ul class="listitems">
  <li data-position="3">Item 3</li>
  <li data-position="2">Item 2</li>
  <li data-position="1">Item 1</li>
  <li data-position="4">Item 4</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

  • 是的,你可以说.为了测试,您可以使用`console.log($(".listitems li").sort(sort_li));`来检查您的控制台.它将为您提供排序列表.毫无疑问,`$('.listitems').html($(".listitems li").sort(sort_li));`将给出与预期相同的结果. (2认同)
  • 在所有li元素上添加“ data-position”(请参阅​​“ kalu”和“ gudiya”),否则会破坏排序逻辑。 (2认同)

小智 8

扩展Rohan的答案,如果您希望此方法适用于多个列表而不只是一个列表,则可以使用以下方法:

HTML:

<ul class="listitems autosort">
    <li data-position="3">Item 3</li>
    <li data-position="2">Item 2</li>
    <li data-position="1">Item 1</li>
    <li data-position="4">Item 4</li>
</ul>

<ul class="listitems autosort">
    <li data-position="5">Item 5</li>
    <li data-position="6">Item 6</li>
    <li data-position="3">Item 3</li>
    <li data-position="4">Item 4</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

Javascript:

$(".listitems.autosort").each(function(){
    $(this).html($(this).children('li').sort(function(a, b){
        return ($(b).data('position')) < ($(a).data('position')) ? 1 : -1;
    }));
});
Run Code Online (Sandbox Code Playgroud)

这样,您可以根据需要添加任意数量的列表,并通过设置类自动排序对所有列表进行排序。

现场例子


gae*_*noM 6

我的建议(完整的 JavaScript)是:

document.addEventListener("DOMContentLoaded", function(e) {
  Array.prototype.slice.call(document.querySelectorAll('.listitems li')).sort(function(a, b) {
    return a.getAttribute('data-position').localeCompare(b.getAttribute('data-position'));
  }).forEach(function(currValue) {
    currValue.parentNode.appendChild(currValue);
  });
});
Run Code Online (Sandbox Code Playgroud)
<ul class="listitems">
    <li data-position="3">Item 3</li>
    <li data-position="2">Item 2</li>
    <li data-position="1">Item 1</li>
    <li data-position="4">Item 4</li>
</ul>
Run Code Online (Sandbox Code Playgroud)