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

相关文章:

javascript - 检查多个输入空值不起作用

javascript - React.js - 创建简单的 Accordion 示例

javascript - 如何使用单击按钮更改状态值

arrays - Swift 选择器 caseInsensitiveCompare

javascript - 设置文本框值而不更改 ng-model。

javascript - 是(:visible) selector not working on class jQuery

html - Bootstrap 4 : Dropdown in card breaks across columns?

html - 页面侧滚动条覆盖页面内容

performance - 当我选择中位数或模式等枢轴时,快速排序的速度并不快

python - 用于返回与已排序 ndarray 的所有元素的索引相对应的元组列表的函数?