You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:51:03