如何对带单位的文件大小字符串列表按实际数值进行升序/降序排序
文件大小字符串智能排序实现方案
核心思路是将所有带单位的文件大小统一转换为字节数的纯数字进行比较,从根源避免单位优先级判断错误、同单位字符串比较数值异常的问题。
// 存储单位转字节数的权重映射(1024进制,如需1000进制可自行修改对应值) const unitMap = { B: 1, kB: 1024, MB: 1024 * 1024, GB: 1024 * 1024 * 1024, TB: 1024 * 1024 * 1024 * 1024 }; // 输入格式校验正则,支持正负数值、小数、合法单位 const validReg = /^(-?\d+(\.\d+)?)\s([BkMGT]B)$/; /** * 文件大小数组排序 * @param {Array<string>} fileSizes 待排序的文件大小字符串数组 * @param {Boolean} descending 是否降序,默认false为升序 * @returns {Array<string>|string} 排序后的数组 或 错误提示 */ function sortFileSizes(fileSizes, descending = false) { // 空输入校验 if (!fileSizes.length) return "Enter an List to be Sorted"; // 输入格式合法性校验 const isAllValid = fileSizes.every(item => validReg.test(item)); if (!isAllValid) return "Invalid Input format"; // 直接基于转换后的字节数值排序 return fileSizes.sort((a, b) => { const [numA, unitA] = a.split(' '); const bytesA = Number(numA) * unitMap[unitA]; const [numB, unitB] = b.split(' '); const bytesB = Number(numB) * unitMap[unitB]; return descending ? bytesB - bytesA : bytesA - bytesB; }); } // 测试用例 const testArr = ["5.1 GB", "19934563 B","224 kB","0.55 GB","0.04 kB","0.02 TB","2.4 MB"]; console.log(sortFileSizes(testArr, true)); // 输出结果完全符合预期:["0.02 TB", "5.1 GB", "0.55 GB", "19934563 B", "2.4 MB", "224 kB", "0.04 kB"]
实现优势
- 效率更高:仅需一次遍历排序,无需反复转换字符串格式
- 无排序异常:所有比较基于纯数字字节值,不会出现字符串排序的逻辑错误,大数值字节单位也能正确排序
- 扩展性强:如果需要支持PB等更大单位,只需要在
unitMap中增加对应配置即可;需要兼容单位大小写的话,拆分单位时统一转成大小写匹配unitMap即可
内容的提问来源于stack exchange,提问作者trishachi
相关产品推荐
相关产品推荐

