首先椿猎,我們來了解一下windows是怎么給文件排序的:特殊字符 > 數(shù)字 > 字母 > 漢字
于是惶岭,我們便可根據(jù)這樣的規(guī)則,給出大致思路犯眠。
- 比較字符串里的第一位按灶,判斷其類型。
- 如果類型不一致筐咧,進(jìn)行排序(遵循特殊字符 > 數(shù)字 > 字母 > 漢字)鸯旁。
- 如果類型一致,判斷值是否相等量蕊。若不等铺罢,則通過localeCompare方法比較。若相等残炮,則進(jìn)行下一位的比較(再到步驟1韭赘,判斷類型),直至字符串的最后一位(name1, name2字符串取最小長度)势就,若仍相等泉瞻,則再通過localeCompare方法比較。
以下是我寫的一個方法:
function sortLikeWin(name1, name2) {
const regexPunc = /[\s!蛋勺!#$%&(()),瓦灶,、.抱完。;贼陶;?@[\]^_`{}~‘’“”《》¥【】+=·…]/
const regexNum = /[0-9]/
const regexEng = /[A-Za-z]/
const regexCh = /[\u4E00-\u9FFF]/
// 排序大星捎椤: 特殊字符 > 數(shù)字 > 字母 > 漢字
// 如果第一個字符相等碉怔,再比較下一個字符
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
})
// 如果第一個字符不相等
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
}
比如你有一個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)
*為什么要做一次類型判斷呢?
因為我發(fā)現(xiàn)禁添,當(dāng)使用 '我'.localeCompare('Q', 'zh') 時撮胧,返回的值是-1,這顯然不是我們想要的老翘。