js中 英文中文混合排序

js中 英文中文數字混合排序

問題簡述:

Array本身有sort方法,但是實現不了中英文混合排序。
一、Array默認的排序

Array的默認排序
sort() 方法用原地算法對數組的元素進行排序,並返回數組。默認排序順序是在將元素轉換爲字符串,然後比較它們的UTF-16代碼單元值序列時構建的

let chinese = ['應用','服務器','張三','藍天','隨便什麼吧']
chinese.sort()
console.log('chinese',chinese)
let english = ['zara','xxxx','test','what','banana','apple','pear','egg']
english.sort()
console.log('english',english)

結果如下:
在這裏插入圖片描述
這裏的英文排序沒有問題,但是中文排序就沒有按照字母順序進行排序。按照了中文字符串的 charCodeAt值進行從小到大的排序。 ‘應用’.charCodeAt() 爲24212 ‘張三’.charCodeAt() 值爲 24352

二、Array的sort中使用函數

sort的參數可以爲一個比較函數,如果沒有指明 compareFunction ,那麼元素會按照轉換爲的字符串的諸個字符的Unicode值進行排序。例如 “Banana” 會被排列到 “cherry” 之前。當數字按由小到大排序時,9 出現在 80 之前,但因爲(沒有指明 compareFunction),比較的數字會先被轉換爲字符串,所以在Unicode順序上 “80” 要比 “9” 要靠前。
如果指明瞭 compareFunction ,那麼數組會按照調用該函數的返回值排序。即 a 和 b 是兩個將要被比較的元素:

  1. 如果 compareFunction(a, b) 小於 0 ,那麼 a 會被排列到 b 之前;
  2. 如果 compareFunction(a, b) 等於 0 , a 和 b 的相對位置不變;
  3. 如果 compareFunction(a, b) 大於 0 , b 會被排列到 a 之前。
    compareFunction(a, b) 必須總是對相同的輸入返回相同的比較結果,否則排序的結果將是不確定的。
    這個對於數字比較有效。 默認的排序會將10 排在9之前
    在這裏插入圖片描述
let numbers = [1,20,10,4,9,6]
numbers.sort((x,y)=>{
     if(x>y){
         return 1
     }else if(x<y){
         return -1
     }else{
         return 0
     }
 })

返回值爲 [1, 4, 6, 9, 10, 20] 這樣就可以按照數字大小正常排序了。
這裏提一下一個很好的亂序方法,可以用sort加compareFunction實現。

sortNumbers.sort(()=>{
   return Math.random()-0.5 
})
三、localeCompare中文排序

localCompare是用本地特定的順序來比較兩個字符串。
stringObject.localeCompare(target)
如果 stringObject 小於 target,則 localeCompare() 返回小於 0 的數。如果 stringObject 大於 target,則該方法返回大於 0 的數。如果兩個字符串相等,或根據本地排序規則沒有區別,該方法返回 0。

let chinese2 = ['應用','服務器','張三','藍天','隨便什麼吧']
chinese2.sort((x,y)=>{
    return x.localeCompare(y)
})

結果爲中文的正常排序
[“服務器”, “藍天”, “隨便什麼吧”, “應用”, “張三”]

四、中英文排序

直接使用localCompare對中英文的結果 ,按照中文按照正常排序在前,英文在後,數字會報錯。且順序難以調整
在這裏插入圖片描述
在這裏插入圖片描述
如果要實現中英文一起的排序就需要把以上的方法組合使用。

 let chineseAndEngAndNumber = ['應用','zoo','服務器','banana','pear','start','張三','藍天','隨便什麼吧']
 chineseAndEngAndNumber.sort((x,y)=>{
   let reg = /[a-zA-Z0-9]/
    if(reg.test(x)|| reg.test(y)){
       if(x>y){
           return 1
       }else if(x<y){
           return -1
       }else{
           return 0
       }
    }else{
       return x.localeCompare(y)
    }
})

結果是我們要的了。
[“banana”, “pear”, “start”, “zoo”, “服務器”, “藍天”, “隨便什麼吧”, “應用”, “張三”]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章