如何使用switch语句基于数组生成自定义时间格式化字符串?
解决自定义时间格式化(基于数组输入)的问题
首先得指出你现有代码里的几个关键问题:
- 你的函数
formatTime里用了time.split(':'),但传入的参数是数组(比如['00','00','10']),数组并没有split方法,这会直接抛出错误; - 你对
switch的用法有误:switch是基于**严格相等(===)**匹配表达式和case值的,你把数组作为switch的表达式,case却是布尔值(比如hour > 0),这种情况下永远不可能匹配成功; - 输出格式和你的预期有差异(比如你要
10sec,但原代码会返回10 sec,多了空格)。
方案一:更直观的if判断实现(推荐)
这种写法逻辑清晰,容易维护,完全满足你的需求:
// 测试用例 let displaySumTimes = ['00', '00', '10']; let displaySumTimes1 = ['00', '10', '10']; let displaySumTimes2 = ['01', '05', '30']; let displaySumTimes3 = ['00', '00', '00']; const formatTime = (timeArr) => { // 将数组中的字符串转成数字,方便判断是否非零 const [hourStr, minuteStr, secStr] = timeArr; const hour = parseInt(hourStr, 10); const minute = parseInt(minuteStr, 10); const sec = parseInt(secStr, 10); // 收集需要显示的时间片段 const timeParts = []; if (hour > 0) { timeParts.push(`${hour}h`); } if (minute > 0) { timeParts.push(`${minute}min`); } // 如果前面没有非零项,即使秒为0也显示(可根据需求调整) if (sec > 0 || timeParts.length === 0) { timeParts.push(`${sec}sec`); } // 拼接成最终字符串 return timeParts.join(' '); }; console.log(formatTime(displaySumTimes)); // 输出: 10sec console.log(formatTime(displaySumTimes1)); // 输出: 10min 10sec console.log(formatTime(displaySumTimes2)); // 输出: 1h 5min 30sec console.log(formatTime(displaySumTimes3)); // 输出: 0sec
方案二:满足你要求的switch实现
如果你坚持要用switch,可以通过将switch表达式设为true,让case匹配布尔条件的方式实现(虽然这种写法不是switch的典型用法,但能满足你的需求):
const formatTimeWithSwitch = (timeArr) => { const [hourStr, minuteStr, secStr] = timeArr; const hour = parseInt(hourStr, 10); const minute = parseInt(minuteStr, 10); const sec = parseInt(secStr, 10); switch (true) { // 小时非零的情况,按需拼接分钟和秒 case hour > 0: return `${hour}h ${minute > 0 ? `${minute}min ` : ''}${sec}sec`.trim(); // 小时为零但分钟非零的情况 case minute > 0: return `${minute}min ${sec}sec`; // 其他情况(小时和分钟都为零) default: return `${sec}sec`; } }; console.log(formatTimeWithSwitch(displaySumTimes)); // 输出: 10sec console.log(formatTimeWithSwitch(displaySumTimes1)); // 输出: 10min 10sec
关键逻辑说明
- 先将数组中的字符串时间转成数字,避免字符串比较的问题(比如
'00'转成0,方便判断是否非零); - 只保留非零的时间单位,按小时→分钟→秒的优先级拼接;
- 处理了全零的边界情况(可以根据你的需求调整成空字符串或其他显示)。
内容的提问来源于stack exchange,提问作者Umbro
相关产品推荐
相关产品推荐

