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

JavaScript统计字符串中Green/Amber/Red出现次数的函数问题排查

问题排查与修正方案

核心问题分析

当前实现存在三个关键问题:

  1. 模板字符串生成时机错误:reportCount在计数逻辑执行前就已创建,后续计数变量的更新不会同步到该字符串中,导致始终返回初始的Green: 0\n Amber: 0\n Red: 0。
  2. 未处理分割后的空格:输入字符串如"Green, Green"经split(",")后会得到["Green", " Green"],第二个元素包含前导空格,无法匹配"Green",导致计数错误。
  3. 函数输出格式与测试用例不匹配:函数设计返回包含三个颜色的完整报告,但测试用例仅预期返回对应颜色的单行结果。

修正后的代码

根据测试用例的预期,调整函数逻辑如下:

function report(str) {
  let countGreen = 0;
  let countAmber = 0;
  let countRed = 0;

  // 分割时处理空格,确保每个元素无前后空白
  const arr = str.split(",").map(item => item.trim());

  arr.forEach(item => {
    if (item === "Green") {
      countGreen += 1;
    } else if (item === "Amber") {
      countAmber += 1;
    } else if (item === "Red") {
      countRed += 1;
    }
  });

  // 收集有计数的项,生成符合测试用例的输出
  const result = [];
  if (countGreen > 0) result.push(`Green: ${countGreen}`);
  if (countAmber > 0) result.push(`Amber: ${countAmber}`);
  if (countRed > 0) result.push(`Red: ${countRed}`);
  
  // 若需返回所有颜色(包括计数为0的项),可替换为:
  // return `Green: ${countGreen}\nAmber: ${countAmber}\nRed: ${countRed}`;
  return result.join("\n");
}

module.exports = report;

关键修改说明

  • 用map(item => item.trim())处理分割后的每个元素,去除前后空白,避免空格导致的匹配失败。
  • 将结果字符串的生成移至计数完成后,确保使用最新的计数值。
  • 根据测试用例的预期,只返回有计数的颜色项;若需要始终返回三个颜色的完整报告,可切换注释里的返回语句。

测试用例适配

原测试用例的预期与函数初始设计存在差异:

  • 若保持函数返回完整三行报告,需修改测试用例的预期值,例如:
    test('counts one green', () => {
      expect(report("Green")).toBe("Green: 1\nAmber: 0\nRed: 0")
    })
    
  • 若坚持测试用例的预期,则使用上述修正后的代码即可通过所有测试。

内容的提问来源于stack exchange,提问作者F I

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:27:34