JavaScript 排序 DOM

标签 javascript

我正在尝试根据 data-* 对 DOM 进行排序属性。 DOM 看起来像这样,尽管重复并且具有递增的 id 和不同的图像源:

<div class="col mb-3" data-id="1" data-filter="Owned">
  <div class="card template">
    <img class="card-img w-100 d-block shadow" alt="Default Template" src="abc.jpg">
    <div class="card-img-overlay">
        <a class="btn btn-dark btn-sm template-preview float-end" role="button" target="_blank" href="organization.html/template.html?id=1">Preview</a>
    </div>
    <div class="card-body">
      <h5 class="card-title">Default Template</h5>
      <p class="card-text text-success">Owned</p>
    </div>
  </div>
</div>

我正在通过 <select /> 进行排序元素,其中 <option /> value 是保存字段和方向的 JSON 文字,例如:

{
  "field": "id",
  "direction": "asc"
}

<select />的更改事件,我有以下内容:

const templateSort_Change = (e) => {
    const templateSort = e.currentTarget;
    const templateSortValue = templateSort.value;
    const sort = JSON.parse(templateSortValue);
    const cols = document.querySelectorAll('div.col');
    const sortedCols = Array.from(cols).sort((a, b) => {
        if (sort.direction === 'desc') {
            return a.dataset[sort.field].toLowerCase() - b.dataset[sort.field].toLowerCase();
        } else {
            return b.dataset[sort.field].toLowerCase() - a.dataset[sort.field].toLowerCase();
        }
    });
    for (let col of cols) {
        col.parentNode.appendChild(col);
    }
}

问题在于,当执行 for/of 循环时,结果为 cols每次都是相同的顺序,查看文档我不确定为什么。我知道我正在进行字符串比较,但这些 id 仍然是个位数(例如 1、2、3 等)。

我的 sort 做错了什么导致数组每次都返回相同顺序的函数?

最佳答案

要对字符串进行排序,您需要localeCompare方法,减号(-)用于对数字而不是字符串进行排序。

  const sortedCols = Array.from(cols).sort((a, b) => {
    if (sort.direction === 'desc') {
        return b.dataset[sort.field].localeCompare(a.dataset[sort.field])
    } else {
        return a.dataset[sort.field].localeCompare(b.dataset[sort.field);
    }
});

关于JavaScript 排序 DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73230312/

相关文章:

javascript - 渲染后如何替换 Angular 组件标签?

javascript - 在页面加载时在编辑 jsp 页面的下拉列表中显示所选值(Spring MVC)

javascript - 正则表达式最大长度为 12,无特殊字符和其他条件

javascript - 如何获取 Cloud Firestore 查询返回的数据?

javascript - 适用于 Javascript 的 EMVCo TLV 字符串解析器库

javascript - react : input type ="checkbox" onChange not triggered

javascript - 自动启动和停止 node.js 脚本

javascript - 使用类元素和 Javascript 进行线钳位

javascript - 通过 jQuery 隐藏超时 block

javascript - 从 CDN 加载时 Foundation JavaScript 出现问题