javascript - jQuery 按数据属性排序

标签 javascript jquery html sorting custom-data-attribute

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

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

但我试图让它们显示数字顺序(升序 - 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>

我有这个:

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

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

最佳答案

一些事情:

  1. sort 不应返回 bool 值,而应返回负数、正数或零*:

    if (a  <  b) return -1; //negative
    if (a  >  b) return 1;  //positive
    if (a === b) return 0;  //0
    

    更容易表达为:

    return a - b;
    
  2. 您可以使用 appendTo() 代替 .each( .append() ),我希望它的性能稍微好一些。

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

$(".list a")
    .sort((a,b) => $(a).data("order") - $(b).data("order"))
    .appendTo(".list");
<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>


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

$(".list").sortChildren();

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

    return this;
}

$(".list").sortChildren();
    
<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>


*感谢charlieftl进行轻微修正。

根据他的说明,sort() 不必返回 -101,我们得到了一些东西:

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

  • 我们不再需要解析这些值。 - 运算符只能用于数值,因此它将自行解析 ab

关于javascript - jQuery 按数据属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53600375/

相关文章:

javascript - 如何从未隐藏的第一个复选框中获取值

javascript - Youtube 嵌入 API 和外部 JS

html - 如何连续拉伸(stretch)/对齐元素?

javascript - 不是正则表达式中的引号

javascript - Laravel 5.5 - 从多选框中检索所有选定的值

javascript - 为什么我的 javascript 代码在用户输入错误的电子邮件地址时验证电子邮件地址运行并陷入循环?

javascript - 加载模板之前完成http请求

javascript - 如何在没有表单的情况下循环单选按钮组?

html - 如何将 CSS 菜单项之间的点转换为线?

javascript - 如何将 Vue 的主应用渲染到 body 元素?