javascript - 按数据属性对列表进行排序

标签 javascript html sorting html-lists

我有一个人员列表,其职称按名字排序,如下所示:

<ul>
  <li data-azsort="smithjohn">
    <a href="#">
      <span class="list-name">John Smith</span>
    </a>
    <span class="list-desc">Professor</span>
  </li>
  ..
  <li data-azsort="barnestom">
    <a href="#">
      <span class="list-name">Tom Barnes</span>
    </a>
    <span class="list-desc">Lecturer</span>
  </li>
</ul>

我添加了data-azsort属性为<li>元素,我想将这些列表元素弹出到一个数组中,并基于该 data-* 进行排序属性(使用纯 JavaScript)。

data-azsort 对列表进行排序的最佳方式是什么? (A-Z),返回相同的代码?仅 JavaScript,无 jQuery 等。

最佳答案

这适用于任意数量的列表:它基本上收集具有您的属性的 ul 中的所有 li,并根据其 data-* 对它们进行排序 属性值并将它们重新附加到其父级。

Array.from(document.querySelectorAll("ul > li[data-azsort]"))
  .sort(({dataset: {azsort: a}}, {dataset: {azsort: b}}) => a.localeCompare(b)) // To reverse it, use `b.localeCompare(a)`.
  .forEach((item) => item.parentNode.appendChild(item));
<ul>
  <li data-azsort="skeetjon">
    <a href="#"><span class="list-name">Jon Skeet</span></a>
    <span class="list-desc">Stack Overflow user</span>
  </li>
  <li data-azsort="smithjohn">
    <a href="#"><span class="list-name">John Smith</span></a>
    <span class="list-desc">Professor</span>
  </li>
  <li data-azsort="barnestom">
    <a href="#"><span class="list-name">Tom Barnes</span></a>
    <span class="list-desc">Lecturer</span>
  </li>
</ul>
<ul>
  <li data-azsort="smithjohn">
    <a href="#"><span class="list-name">John Smith</span></a>
    <span class="list-desc">Professor</span>
  </li>
  <li data-azsort="barnestom">
    <a href="#"><span class="list-name">Tom Barnes</span></a>
    <span class="list-desc">Lecturer</span>
  </li>
  <li data-azsort="skeetjon">
    <a href="#"><span class="list-name">Jon Skeet</span></a>
    <span class="list-desc">Stack Overflow user</span>
  </li>
</ul>

有趣的是,它获取同一个数组中的所有li,并对它们进行排序,但最终找出li<的列表 原本属于。这是一个非常简单直接的解决方案。

如果您想按数字数据属性对元素进行排序,请改用此排序函数:

// Presumably, the data-* attribute won’t be called `azsort`. Let’s call it `numsort`.
({dataset: {numsort: a}}, {dataset: {numsort: b}}) => Number(a) - Number(b) // `Number(b) - Number(a)` to reverse the sort.
<小时/>

稍长的 ECMAScript 5.1 替代方案是:

Array.prototype.slice.call(document.querySelectorAll("ul > li[data-azsort]")).sort(function(a, b) {
  a = a.getAttribute("data-azsort");
  b = b.getAttribute("data-azsort");

  return a.localeCompare(b);
}).forEach(function(node) {
  node.parentNode.appendChild(node);
});

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

相关文章:

javascript - JS中生成不重复随机数

javascript - VueJS 2 Cli 使用 Dev Server 将 POST 请求转换为 GET 请求

javascript - ionic Angular 嵌套 ng-repeat 过滤器,如果为空则隐藏标题

python - CSS 和 JS 无法在 Flask 框架上运行

C#按升序和降序对数组进行排序

javascript - 如何在向 div 标签添加文本时添加换行符

javascript - HTML5 媒体 TimeRanges 对象

javascript - 使用CSS让点击的缩略图显示全尺寸

javascript - 数据表按时间排序

c# - 使用 OrderBy<> 对项目数组进行排序