咨询:收银机项目中reduce方法嵌套switch语句失效原因
问题根源分析
你的switch语句看似“失效”,主要有两个关键原因:
1. reduce回调未返回累加器值
reduce方法的核心逻辑是每次迭代必须返回更新后的累加器,否则下一次迭代的累加器会变成undefined,最终整个reduce的结果也会是undefined。你的代码里只在switch的case里修改了sum,但没有把更新后的sum返回出去:
let register = cid.reduce( (sum, curr) => { switch (curr[0]) { case "PENNY" : sum += curr[1] * 0.01; break; default: console.log("Unexpected currency unit"); } // 这里缺少return sum; 导致累加器值无法传递到下一次迭代 },0)
没有返回的话,第一次迭代后累加器的更新值就丢失了,后续迭代的sum都会变成undefined,最终register也得不到你想要的累加结果。
2. 未覆盖所有货币单位的case
你只编写了"PENNY"对应的case,但cid数组里还有"NICKEL"、"DIME"、"QUARTER"等其他货币单位,这些没有对应的case处理,所以遍历到这些元素时,都会触发default分支的日志输出。这会干扰你的判断,让你误以为连第一个"PENNY"的case都没生效,但实际上第一个元素是成功匹配到case的——只是因为没有返回累加器,最终结果不符合预期,加上后续的default日志,才让你觉得switch完全失效了。
另外补充一个小细节:cid里的第二个元素已经是该货币单位的美元总价值了,比如["PENNY", 1.01]就代表收银机里有1.01美元的便士,不需要再乘以0.01,这会导致你计算的结果缩小100倍,也是和你预期输出不符的一个原因。
内容的提问来源于stack exchange,提问作者Yann
相关产品推荐
相关产品推荐

