【问题标题】:Sort alphaNumeric HTML list排序 alphaNumeric HTML 列表
【发布时间】:2019-03-26 04:36:32
【问题描述】:

我需要对一个 alphaNumeric 列表进行排序。我可以排序,但有些排序,因为它是 alphaNumeric,我无法将 abc1 放在 abc10 之前。

我的 HTML 代码:

<ul class="theList">
   <li><b>abc11:</b>Hello</li>
   <li><b>abc10:</b>Hello</li>
   <li><b>xyz24:</b>Hello</li>
   <li><b>abc1:</b>Hello</li>
   <li><b>xyz2:</b>Hello</li>
</ul>

我的 JavaScript:

  $(document).ready(function() {
    var list, i, switching, b, shouldSwitch;
    list = document.getElementsByClassName("theList");
    for (var j = 0; j < list.length; j++) {
      switching = true;
      while (switching) {
        switching = false;
        b = list[j].getElementsByTagName("li");
        for (i = 0; i < (b.length - 1); i++) {
          shouldSwitch = false;
          if (b[i].innerHTML.toLowerCase() > b[i + 1].innerHTML.toLowerCase()) {
            shouldSwitch = true;
            break;
          }
        }
        if (shouldSwitch) {
          b[i].parentNode.insertBefore(b[i + 1], b[i]);
          switching = true;
        }
      }
    }
  });

我的结果:

  • abc10:你好
  • abc11:你好
  • abc1:你好
  • xyz24:你好
  • xyz2:你好

预期结果:

  • abc1:你好
  • abc10:你好
  • abc11:你好
  • xyz2:你好
  • xyz24:你好

我错过了什么?

【问题讨论】:

    标签: javascript jquery html list sorting


    【解决方案1】:

    在文档之外对lis 在他们自己的数组中进行排序可能会容易得多,然后以正确的顺序再次将它们附加到ul。您可以使用localeCompare 来检查哪个字符串按字典顺序排在第一位,不需要 jQuery:

    const theList = document.querySelector('.theList');
    const lis = Array.from(theList.children);
    const firstText = elm => elm.children[0].textContent;
    lis.sort((a, b) => firstText(a).localeCompare(firstText(b)));
    lis.forEach(li => theList.appendChild(li));
    <ul class="theList">
       <li><b>abc11:</b>Hello</li>
       <li><b>abc10:</b>Hello</li>
       <li><b>xyz24:</b>Hello</li>
       <li><b>abc1:</b>Hello</li>
       <li><b>xyz2:</b>Hello</li>
    </ul>

    要对多个此类列表进行排序,请遍历 querySelectorAll

    document.querySelectorAll('.theList').forEach((theList) => {
      const lis = Array.from(theList.children);
      const firstText = elm => elm.children[0].textContent;
      lis.sort((a, b) => firstText(a).localeCompare(firstText(b)));
      lis.forEach(li => theList.appendChild(li));
    });
    <ul class="theList">
       <li><b>abc11:</b>Hello</li>
       <li><b>abc10:</b>Hello</li>
       <li><b>xyz24:</b>Hello</li>
       <li><b>abc1:</b>Hello</li>
       <li><b>xyz2:</b>Hello</li>
    </ul>
    
    <ul class="theList">
       <li><b>abc11:</b>Hello</li>
       <li><b>abc10:</b>Hello</li>
       <li><b>xyz24:</b>Hello</li>
       <li><b>abc1:</b>Hello</li>
       <li><b>xyz2:</b>Hello</li>
    </ul>

    【讨论】:

    • 这很好用,但是我有多个具有相同类名的此类列表。这个只对第一个列表进行排序。
    • 查看编辑,改用querySelectorAll 并迭代
    • 这就像一个魅力!谢谢!我正在尝试将上述逻辑仅用于一个 select 元素。我似乎遇到了错误。我会认为它背后的逻辑是相同的。
    • 我刚刚注意到一个排序问题,希望您能帮助我解决这个问题。当我运行您的代码时,我确实对值进行了排序。但是如果我在列表中添加一个abc2。它的排序是这样的:abc1, abc10, abc11, abc2。有什么方法可以让我得到它,比如abc1, abc2, abc10, abc11
    • 将另一个参数传递给localeCompare'en-u-kn-true',它会将数字作为数字而不是按字典顺序进行比较。
    猜你喜欢
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2012-05-08
    • 2017-10-04
    相关资源
    最近更新 更多