jQuery按数据属性排序

ult*_*nja 2 html javascript sorting jquery custom-data-attribute

我在div中有一些项目data-order附加了data属性:

<div class="list">
   <a href="#" data-order="4">Thing 4</a>
   <a href="#" data-order="3">Thing 3</a>
   <a href="#" data-order="1">Thing 1</a>
   <a href="#" data-order="2">Thing 2</a>
</div>
Run Code Online (Sandbox Code Playgroud)

但是我试图让它们显示数字顺序(升序 - 1,2,3等):

<div class="list">
   <a href="#" data-order="1">Thing 1</a>
   <a href="#" data-order="2">Thing 2</a>
   <a href="#" data-order="3">Thing 3</a>
   <a href="#" data-order="4">Thing 4</a>
</div>
Run Code Online (Sandbox Code Playgroud)

我有这个:

  $(".list a").sort(function(a, b) {
    return $(a).attr("data-order") > $(b).attr("data-order");
  }).each(function() {
    $(".list").prepend(this);
  });
Run Code Online (Sandbox Code Playgroud)

但这似乎真的搞乱了订单.所以我不太清楚我做错了什么,或者是否有更简单的方法可以让它们正确排序.

Tyl*_*per 7

一些东西:

  1. sort不应该返回布尔值,而是返回负数,正数或零*:

    if (a  <  b) return -1; //negative
    if (a  >  b) return 1;  //positive
    if (a === b) return 0;  //0
    
    Run Code Online (Sandbox Code Playgroud)

    更容易表达为:

    return a - b;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 你可以appendTo()代替.each( .append() )我使用,我希望它会表现得稍好一些.

  3. .attr("data-order")可以表示为.data("order")(虽然这更多是一个偏好的问题).

$(".list a")
    .sort((a,b) => $(a).data("order") - $(b).data("order"))
    .appendTo(".list");
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="list">
  <a href="#" data-order="4">Thing 4</a>
  <a href="#" data-order="3">Thing 3</a>
  <a href="#" data-order="1">Thing 1</a>
  <a href="#" data-order="2">Thing 2</a>
</div>
Run Code Online (Sandbox Code Playgroud)


更进一步,你甚至可以创建自己的jQuery插件/方法:

$(".list").sortChildren();
Run Code Online (Sandbox Code Playgroud)

$.fn.sortChildren = function() {
    this
      .children()
      .sort((a,b) => $(a).data("order") - $(b).data("order") || -1)
      .appendTo(this);

    return this;
}

$(".list").sortChildren();
    
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="list">
  <a href="#" data-order="4">Thing 4</a>
  <a href="#" data-order="3">Thing 3</a>
  <a href="#" data-order="1">Thing 1</a>
  <a href="#" data-order="2">Thing 2</a>
</div>
Run Code Online (Sandbox Code Playgroud)


*感谢charlieftl稍作修正.

随着他的注意,sort()并没有返回-1,0或者1,我们获得的几件事情:

  • 我们可以简单a - b地确定排序顺序

  • 我们不再需要解析这些值.该-运营商只能用数值来使用,所以它将解析ab自身.