JS实现按文件名称排序效果(以windows为标准)

首先,我们来了解一下windows是怎么给文件排序的:特殊字符 > 数字 > 字母 > 汉字
于是,我们便可根据这样的规则,给出大致思路。

  1. 比较字符串里的第一位,判断其类型。
  2. 如果类型不一致,进行排序(遵循特殊字符 > 数字 > 字母 > 汉字)。
  3. 如果类型一致,判断值是否相等。若不等,则通过localeCompare方法比较。若相等,则进行下一位的比较(再到步骤1,判断类型),直至字符串的最后一位(name1, name2字符串取最小长度),若仍相等,则再通过localeCompare方法比较。

以下是我写的一个方法:

function sortLikeWin(name1, name2) {
  const regexPunc = /[\s!!#$%&(()),,、.。;;?@[\]^_`{}~‘’“”《》¥【】+=·…]/
  const regexNum = /[0-9]/
  const regexEng = /[A-Za-z]/
  const regexCh = /[\u4E00-\u9FFF]/
  // 排序大小: 特殊字符 > 数字 > 字母 > 汉字
  // 如果第一个字符相等,再比较下一个字符
  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 {
        // 中文需根据拼音顺序
        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)))
// 最终结果为 ['》', '1', 'r', 't', '你', '我']
console.log(finalList)

*为什么要做一次类型判断呢?
因为我发现,当使用 '我'.localeCompare('Q', 'zh') 时,返回的值是-1,这显然不是我们想要的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。