中英文按首字母分组排序

// 检测是否为中文,true表示是中文,false表示非中文
const isChinese = (str) => {
  // 中文万国码正则
  if (/[\u4E00-\u9FCC\u3400-\u4DB5\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d]/.test(str)) {
      return true;
  } else {
      return false;
  }
}

// 检测英文
const isEnglish = (str) => {
  return (/^[a-zA-Z]+$/.test(str))
}

const chineseSort = (arrList,compareItem) => {
  let arr = arrList.concat([])
  if (!String.prototype.localeCompare) return null
  let letters = 'abcdefghijklmnopqrstuvwxyz'.split('')
  let zh = '阿八嚓哒妸发旮哈i讥咔垃吗拏噢妑七呥撒它uv挖夕丫帀'.split('')
  let segs = [{letter: '#',data: []}]
  letters.map((item, i) => {
    let cur = { letter: item, data: [] }
    arr.map((item,index) => {
      item[compareItem] = item[compareItem].replace(/\s/g,"")
      if(isChinese(item[compareItem].split('')[0])){
        if(!(i==8 || i==20 || i==21)){
         let next = i+1
         if(i==7){
           next = i+2
         }
         if(i==19){
           next = i+3
         }
         if (item[compareItem].localeCompare(zh[i]) >= 0 && item[compareItem].localeCompare(zh[next]) < 0) {
           cur.data.push(item)
         }
       }
      }else if(isEnglish(item[compareItem].split('')[0])){
        if (item[compareItem].toLowerCase().localeCompare(letters[i]) >= 0 && item[compareItem].toLowerCase().localeCompare(letters[i + 1]) < 0) {
          cur.data.push(item)
        }
      }else{
        segs[0].data.push(item)
        arr.splice(index,1)
      }
    })
    if (cur.data.length) {
      cur.data.sort(function (a, b) {
        return a[compareItem].localeCompare(b[compareItem])
      })
      segs.push(cur)
    }
  })
  if(segs[0].data.length<=0){
    segs.shift()
  }
  return segs
}

 

posted @ 2021-08-06 15:06  张哲Zeo  阅读(225)  评论(0)    收藏  举报