JS實(shí)現(xiàn)按文件名稱(chēng)排序效果(以windows為標(biāo)準(zhǔn))

首先,我們來(lái)了解一下windows是怎么給文件排序的:特殊字符 > 數(shù)字 > 字母 > 漢字
于是,我們便可根據(jù)這樣的規(guī)則,給出大致思路。

  1. 比較字符串里的第一位,判斷其類(lèi)型。
  2. 如果類(lèi)型不一致,進(jìn)行排序(遵循特殊字符 > 數(shù)字 > 字母 > 漢字)。
  3. 如果類(lèi)型一致,判斷值是否相等。若不等,則通過(guò)localeCompare方法比較。若相等,則進(jìn)行下一位的比較(再到步驟1,判斷類(lèi)型),直至字符串的最后一位(name1, name2字符串取最小長(zhǎng)度),若仍相等,則再通過(guò)localeCompare方法比較。

以下是我寫(xiě)的一個(gè)方法:

function sortLikeWin(name1, name2) {
  const regexPunc = /[\s!!#$%&(()),,、.。;;?@[\]^_`{}~‘’“”《》¥【】+=·…]/
  const regexNum = /[0-9]/
  const regexEng = /[A-Za-z]/
  const regexCh = /[\u4E00-\u9FFF]/
  // 排序大小: 特殊字符 > 數(shù)字 > 字母 > 漢字
  // 如果第一個(gè)字符相等,再比較下一個(gè)字符
  let compareValue = false
  const minLength = Math.min(name1.length, name2.length)
  let i = 0
  do {
    const aIndex = name1.charAt(i)
    const bIndex = name2.charAt(i)
    const nameFirstType = [aIndex, bIndex].map((item) => {
      if (item.match(regexPunc)) {
        return 0
      }
      if (item.match(regexNum)) {
        return 1
      }
      if (item.match(regexEng)) {
        return 2
      }
      if (item.match(regexCh)) {
        return 3
      }
      return -1
    })
    // 如果第一個(gè)字符不相等
    if (aIndex !== bIndex) {
      if (nameFirstType[0] !== nameFirstType[1]) {
        compareValue = nameFirstType[0] - nameFirstType[1]
        break
      } else {
        // 中文需根據(jù)拼音順序
        compareValue = aIndex.localeCompare(bIndex, 'zh')
        break
      }
    }
    if (i === minLength) {
      compareValue = name1.localeCompare(name2, 'zh')
      break
    }
    i += 1
  } while (i <= minLength)
  return compareValue
}

比如你有一個(gè)list(['我', '你', '1', 'r', 't', '》'])

// 排序
const list = ['我', '你', '1', 'r', 't', '》']
const finalList = list.sort((a, b) => (sortLikeWin(a, b)))
// 最終結(jié)果為 ['》', '1', 'r', 't', '你', '我']
console.log(finalList)

*為什么要做一次類(lèi)型判斷呢?
因?yàn)槲野l(fā)現(xiàn),當(dāng)使用 '我'.localeCompare('Q', 'zh') 時(shí),返回的值是-1,這顯然不是我們想要的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容