整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          如何用JavaScript排序包含字母的數字字符串

          如何用JavaScript排序包含字母的數字字符串

          日常開發中,我們經常會遇到需要對帶字母的數字字符串進行排序的場景。比如,在電商網站中,我們需要對包含商品編號的字符串進行排序,這些編號可能既有數字部分又有字母部分。今天,我就來給大家分享一個簡單易懂的方法,用JavaScript實現這樣的排序。

          需求場景

          想象一下,我們在開發一個庫存管理系統,需要對一系列商品編號進行排序。這些商品編號是由數字和字母組成的,例如 12A, 2A, B3, 12B, C1。如果我們按照默認的字符串排序方式,結果往往不是我們想要的。這時候,我們就需要一種能正確處理這種帶字母數字字符串的排序方法。

          方法一:使用localeCompare

          JavaScript中的localeCompare方法可以幫助我們實現這一需求。它不僅可以比較字符串,還能根據需要進行數字排序。下面是具體的實現代碼:

          const items=[
            '12A',
            '2A',
            'B3',
            '12B',
            'C1',
            'A21',
            '21B',
            'B19',
            'C3',
            'D2'
          ];
          
          const sortedItems=items.sort((a, b)=> {
            return a.localeCompare(b, undefined, {
              numeric: true,
              sensitivity: 'base'
            });
          });
          
          console.log(sortedItems);

          在這個例子中,我們創建了一個包含商品編號的數組items。然后,我們使用sort方法對數組進行排序,并在排序函數中調用localeCompare方法。設置numerictrue可以使數字部分按照數值大小排序,而sensitivity設置為base則忽略大小寫進行比較。

          排序后的結果是:

          [ '2A',  '12A', '12B',
            '21B', 'A21', 'B3',
            'B19', 'C1',  'C3',
            'D2']

          方法二:使用Intl.Collator

          另一種方法是使用Intl.Collator構造函數創建一個比較器實例,它同樣能夠對字符串進行自然排序。下面是具體實現:

          const items=[
            '12A',
            '2A',
            'B3',
            '12B',
            'C1',
            'A21',
            '21B',
            'B19',
            'C3',
            'D2'
          ];
          
          const collator=new Intl.Collator(undefined, {
            numeric: true,
            sensitivity: 'base'
          });
          
          const sortedItems=items.sort((a, b)=> {
            return collator.compare(a, b);
          });
          
          console.log(sortedItems);

          這個方法和localeCompare類似,只是我們通過Intl.Collator創建了一個比較器實例,并使用它的compare方法來進行排序。

          排序后的結果與之前相同:

          [
            '2A',  '12A', '12B',
            '21B', 'A21', 'B3',
            'B19', 'C1',  'C3',
            'D2'
          ]

          結束

          通過使用localeCompareIntl.Collator方法,我們可以輕松地對帶字母的數字字符串進行自然排序。這不僅在電商網站的商品編號排序中非常實用,在處理任何包含數字和字母的字符串排序時都能派上用場。

          i列表排序

          <html>
          <head>
          <meta charset="utf-8">
          <title>無標題文檔</title>
          <style>
          #ul1 {background:green;}
          #ul2 {background:yellow;}
          </style>
          <script>
          window.onload=function (){
              var oUl1=document.getElementById('ul1');
              var oBtn=document.getElementById('btn1');
          
              oBtn.onclick=function (){
              var aLi=oUl1.getElementsByTagName('li');
              //aLi.sort(); 此方法不可行,因為aLi是元素集合,不是數組,sort()只能用于數組排序
              var arr=[];
          
              for(var i=0;i<aLi.length;i++){
              arr[i]=aLi[i]; //aLi元素集合轉換為數組
              }
          
              arr.sort(function (li1, li2){ //自定義排序函數
              var n1=parseInt(li1.innerHTML); //將字符串轉換為整數
              var n2=parseInt(li2.innerHTML);
              return n1-n2;
              });
              //alert(arr[0].innerHTML);
              for(var i=0;i<arr.length;i++){
              //alert('該把'+arr[i].innerHTML+'插入到最后');
              oUl1.appendChild(arr[i]);
              }
              };
          };
          </script>
          </head>
          <body>
          <input id="btn1" type="button" value="排序" />
          <ul id="ul1">
          <li>34</li>
          <li>25</li>
          <li>9</li>
          <li>88</li>
          <li>54</li>
          </ul>
          </body>
          </html>

          appendChild()方法理解:

          target.appendChild(newnode)

          1.先把元素從原有父級上刪掉

          2.添加到原有的父級元素下, 起到了移動子元素的作用。

          值類型排序

          console.log([5,6,2,3].sort())

          字符串類型的數組排序

          console.log(['中國01#', '中國02#', '中國023#', '中國10#', '中國1#', '中國2#', '中國11#', '中國20#'].sort())

          雖然排序了,但是按照ASCII排序的,中間是數字,這樣的方式顯然不是我們需要的

          熟悉sort方法的同學知道sort支持傳入比較器,是的我們可以自定義比較器傳入,這樣想要什么的排序都可以實現,但是復雜比較器實現起來也有一定的工作量和難度的,因此我們要介紹的主角出現了,它就是Intl.Collator

          Intl.Collator比較器

          console.log(['中國01#', '中國02#', '中國023#', '中國10#', '中國1#', '中國2#', '中國11#', '中國20#']
               .sort(new Intl.Collator('zh-CN').compare))

          默認比較器排序的結果和sort默認的比較器排序一樣,但是我們可以給比較傳入一個排序的options參數,如是否應使用數字對照,使得“1”<“2”<“10”。可能的值為 true 和 false;默認值為 false

          console.log(['中國01#', '中國02#', '中國023#', '中國10#', '中國1#', '中國2#', '中國11#', '中國20#']
              .sort(new Intl.Collator('zh-CN', { numeric: true }).compare))

          此時排序的就是按照中文數字的方式排序了

          補:options 可選

          包含一些或所有的以下屬性的對象:

          localeMatcher

          使用的區域匹配算法。可能的值為:"lookup" 和 "best fit";默認值為 "best fit"。參見 Intl 頁面以了解此選項的詳細信息。

          usage

          比較是用于排序還是用于搜索匹配的字符串。可能的值為 "sort" 和 "search";默認值為 "sort"。

          sensitivity

          字符串中的哪些差異應導致結果值為非零。可能的值為:

          • "base":只有字母不同的字符串比較不相等。例如:a ≠ b、a=á、a=A。
          • "accent":只有不同的基本字母或重音符號和其他變音符號的字符串比較為不相等。例如:a ≠ b、a ≠ á、a=A。
          • "case":只有不同的基本字母或大小寫的字符串比較不相等。例如:a ≠ b、a=á、a ≠ A。
          • "variant":字符串的字母、重音和其他變音符號,或不同大小寫比較不相等。也可以考慮其他差異。例如:a ≠ b、a ≠ á、a ≠ A。

          "sort" 用法(usage)的默認值為 "variant"。"search" 用法則取決于區域。

          ignorePunctuation

          是否應忽略標點。可能的值為 true 和 false;默認值為 false。

          numeric

          是否應使用數字對照,使得“1”<“2”<“10”。可能的值為 true 和 false;默認值為 false。此選項也可以通過 Unicode 擴展鍵 kn 設置;當兩者同時設置時,options 屬性的優先級更高。

          caseFirst

          是否應該首先根據大小寫排序。可能的值為 "upper"、"lower" 和 "false"(使用區域的默認設置)。此選項也可以通過 Unicode 擴展鍵 kf 設置;當兩者同時設置時,options 屬性的優先級更高。

          collation

          一些區域的變體。可能的值包括:

          • big5han(漢語;在 Chrome 和 Edge 中不可用)
          • compat(阿拉伯語)
          • dict(僧伽羅語)
          • direct(已棄用,請勿使用)
          • ducet(不可用,請勿使用)
          • emoji(root)
          • eor(root)
          • gb2312(漢語;在 Chrome 和 Edge 中不可用)
          • phonebk(德語)
          • phonetic(林加拉語)
          • pinyin(漢語)
          • reformed(瑞典語;不需要明確指定,因為這是瑞典語的默認設置)
          • searchjl(韓語;請勿用于排序)
          • stroke(漢語)
          • trad
          • unihan(漢語、日語和韓語;在 Chrome 和 Edge 中不可用)
          • zhuyin(漢語)

          此選項也可以通過 Unicode 擴展鍵 co 設置;當兩者同時設置時,options 屬性的優先級更高。


          主站蜘蛛池模板: 国产激情一区二区三区成人91 | 国产一区二区三区播放心情潘金莲 | 欧洲精品无码一区二区三区在线播放| 骚片AV蜜桃精品一区| aⅴ一区二区三区无卡无码| 亚洲av日韩综合一区久热| 91精品一区二区三区久久久久| 乱中年女人伦av一区二区| 国精产品999一区二区三区有限| 99无码人妻一区二区三区免费 | 女同一区二区在线观看| 91午夜精品亚洲一区二区三区| 性色A码一区二区三区天美传媒| 日韩精品无码视频一区二区蜜桃| 春暖花开亚洲性无区一区二区| 精品香蕉一区二区三区| 亚洲日韩精品国产一区二区三区| 高清精品一区二区三区一区| 中文字幕乱码亚洲精品一区 | 精品国产一区二区三区久久影院 | 在线视频精品一区| 精品一区二区三区无码视频| 国产麻豆媒一区一区二区三区| 韩国一区二区三区| 日韩一区二区三区视频| 国产福利电影一区二区三区,日韩伦理电影在线福 | 激情久久av一区av二区av三区| 国产成人久久一区二区三区| 日韩一区二区三区免费播放| 精品日韩在线视频一区二区三区 | 濑亚美莉在线视频一区| 日韩一区二区三区精品| 欧洲精品无码一区二区三区在线播放| 久久国产精品亚洲一区二区| 91福利视频一区| 日本一区二区三区日本免费| 亚洲性日韩精品一区二区三区| 精品视频一区二区三区免费| 国产福利一区二区三区视频在线| 亚洲一区AV无码少妇电影| 福利一区二区在线|