如何将时长字符串列表按实际时间长度排序而非字母序?
按实际时长排序时间字符串列表
要实现按实际时间长度排序,核心是将每个时长字符串转换为统一的时间单位(比如小时),再基于转换后的数值排序。具体实现如下:
步骤说明
- 定义单位换算规则:覆盖单复数形式,确保不同表述的时长能正确转换
- 编写解析函数:提取字符串中的数字和单位,计算总小时数
- 替换排序逻辑:用自定义比较函数替代原有的字母序排序
完整代码
// 单位与小时的换算映射,兼容单复数 const unitConversion = { hour: 1, hours: 1, day: 24, days: 24, week: 168, weeks: 168 }; // 将时长字符串转换为总小时数 const calculateTotalHours = (durationStr) => { const [, numStr, unit] = durationStr.match(/(\d+) (\w+)/) || []; if (!numStr || !unit) return 0; return parseInt(numStr, 10) * (unitConversion[unit] || 0); }; // 获取去重后的时长列表并按实际时长排序 const durations = [...new Set(this.courses.map(item => item.fields.duration))] .sort((a, b) => calculateTotalHours(a) - calculateTotalHours(b));
代码解释
unitConversion处理了单复数单位(如day和days都对应24小时),避免格式差异导致的转换错误calculateTotalHours通过正则表达式提取数字和单位,计算出该时长对应的总小时数- 先通过
Set去重,再使用sort比较两个时长的总小时数,实现从小到大的实际时长排序
测试原列表['1 day', '2 days', '2 weeks', '3 days', '3 hours', '4 days'],排序后将得到期望结果:['3 hours', '1 day', '2 days', '3 days', '4 days', '2 weeks']
内容的提问来源于stack exchange,提问作者user2953989
相关产品推荐
相关产品推荐

