Codewars Human readable duration format题JS代码报错求解
问题原因&修复方案
核心错误点
- 错误将数组
notZeros用+=操作赋值,JS会自动把数组转为字符串进行拼接,导致notZeros从存储索引的数组变成了连续的索引字符串,后续遍历逻辑完全失效 - 单位顺序判断逻辑错误,原代码存储的单位是按秒、分、时、天、年从小到大排列的,拼接输出时需要按从大到小的顺序排列,原分隔符的判断逻辑也完全写反
修复后的代码
function formatDuration (seconds) { if (seconds == 0) { return "now"; } let Y = Math.floor(seconds / 31536000); let D = Math.floor(seconds / 86400 - Y * 365); let H = Math.floor(seconds / 3600 - D * 24 - Y * 8760); let M = Math.floor(seconds / 60 - H * 60 - D * 1440 - Y * 525600); let S = seconds - M * 60 - H * 3600 - D * 86400 - Y * 31536000; let YY = Y + " year" + (Y != 1 ? "s" : ""); let DD = D + " day" + (D != 1 ? "s" : ""); let HH = H + " hour" + (H != 1 ? "s" : ""); let MM = M + " minute" + (M != 1 ? "s" : ""); let SS = S + " second" + (S != 1 ? "s" : ""); // 调整为大单位在前、小单位在后的顺序,无需额外倒序处理 let timeWhole = [YY, DD, HH, MM, SS]; let timeDigits = [Y, D, H, M, S]; // 正确收集非零的单位项 let validUnits = []; for (let i = 0; i < timeDigits.length; i++) { if (timeDigits[i] > 0) { validUnits.push(timeWhole[i]); } } // 简化拼接逻辑:只有1项直接返回,≥2项时最后两项用and连接,前面用逗号分隔 if (validUnits.length === 1) { return validUnits[0]; } const lastUnit = validUnits.pop(); return validUnits.join(', ') + ' and ' + lastUnit; }
修复说明
调整后直接按年到秒的顺序收集非零单位,拼接逻辑仅需要处理最后两项的and分隔即可,完全规避了原代码多余开头逗号、单位顺序错乱的问题,所有测试用例均可正常通过。
内容的提问来源于stack exchange,提问作者jaclaw
相关产品推荐
相关产品推荐

