跳转到内容

路径排序

ts
import path from 'node:path'

/**
 * 路径排序
 */
export function sortPaths(
  paths: string[],
  order: 'asc' | 'desc' = 'desc',
) {
  return paths.sort((a, b) => {
    const aParts = path.normalize(a).split(path.sep)
    const bParts = path.normalize(b).split(path.sep)

    for (let i = 0; i < Math.min(aParts.length, bParts.length); i++) {
      if (aParts[i] !== bParts[i]) {
        return aParts[i] < bParts[i] ? -1 : 1
      }
    }

    if (order === 'asc') {
      return aParts.length - bParts.length
    } else {
      return bParts.length - aParts.length
    }
  })
}

// 使用示例
const paths = [
  'C:\\Windows\\System32',
  'a/b',
  'a/b/c',
  'r/e',
  'a',
  'r',
  'C:\\Windows',
]

// 适合删除文件
console.log(sortPaths(paths))
/*
[
  'C:\\Windows\\System32',
  'C:\\Windows',
  'a/b/c',
  'a/b',
  'a',
  'r/e',
  'r'
]
*/

// 适合创建文件
console.log(sortPaths(paths, 'asc'))
/*
[
  'C:\\Windows',
  'C:\\Windows\\System32',
  'a',
  'a/b',
  'a/b/c',
  'r',
  'r/e'
]
*/