JavaScript统计字符串中Green/Amber/Red出现次数的函数问题排查
问题排查与修正方案
核心问题分析
当前实现存在三个关键问题:
- 模板字符串生成时机错误:
reportCount在计数逻辑执行前就已创建,后续计数变量的更新不会同步到该字符串中,导致始终返回初始的Green: 0\n Amber: 0\n Red: 0。 - 未处理分割后的空格:输入字符串如
"Green, Green"经split(",")后会得到["Green", " Green"],第二个元素包含前导空格,无法匹配"Green",导致计数错误。 - 函数输出格式与测试用例不匹配:函数设计返回包含三个颜色的完整报告,但测试用例仅预期返回对应颜色的单行结果。
修正后的代码
根据测试用例的预期,调整函数逻辑如下:
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
相关产品推荐
相关产品推荐

