注释很详细,直接上代码
涉及知识点:
- 正则表达式
 - outerHTML
 - join
 - map
 
题干:

我的答案
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
  </head>
  <body>
    <ul id="myList">
      <li id="item1">项目 1</li>
      <li id="item3">项目 3</li>
      <li id="item2">项目 2</li>
      <li id="item4">项目 4</li>
    </ul>
    <script>
      /**
       * 首先谈谈我们为什么这样做
       * JS更多的是面向应用的,对于这题我们不能停留在过测例,思路打开学得更多
       * 我们想要对id进行排序,id是字符串,所以需要提取id中的数字,然后进行比较
       * 这里很多小友会直接比较,因为当其他字符相同,数字在十以内的字符串确实是可以直接比较但固然不符合逻辑,eg."10"<"2"
       * 提取数字的方法怎么选择呢,如果使用substring可以吗,对这题肯定是可以了,但倘若不是item呢,这里我们又能用到正则表达式提取数字的方法,
       * 使用正则表达式`从后往前`匹配数字,提取到id中的数字字符串,然后转为数字进行比较
       */
      function sortAndReturnTextContent() {
        let items = document.getElementById("myList").children;
        // 在此补全代码
        const newArrSortByItems = Array.from(items).sort((idFront, idBack) => {
          const regex = /\d+$/; // 正则表达式: 从后往前匹配数字
          let numFromIdFront = Number(idFront.id.match(regex)[0]); // 提取id中的数字(字符串)并转为数字
          let numFromIdBack = Number(idBack.id.match(regex)[0]);
          return numFromIdFront < numFromIdBack ? -1 : 1; // 数字比较:返回值为负数表示idFront排在idBack前面,反之则后面
        });
        /**
         *将排序后的数组的outerHTML转换为HTML字符串并重新赋值给myList的innerHTML
         *这里注意区分 innerHTML 和 outerHTML
         *outerHTML: 即该元素及其内部的字符串
         *innerHTML: 即该元素内部的字符串
         *为什么需要用join("")
         *因为map返回的是字符串数组,需要用join("")转换为字符串
         *join("")里面的字符串是分割符,但这里用空字符串即可
         */
        document.getElementById("myList").innerHTML = newArrSortByItems
          .map((item) => item.outerHTML)
          .join("");
      }
      sortAndReturnTextContent();
    </script>
  </body>
</html>
                

















