使用reduce与substring计算单词数组字符长度时首元素方法未生效
问题分析与修正
你的代码核心问题出在reduce的使用逻辑上:
- 没给reduce设置初始值,导致第一次迭代时
prev是第一个单词处理后的字符串,后续迭代会把所有处理后的字符串拼接起来,最后再取总长度——虽然结果可能对,但逻辑绕了弯路,且数组为空时会直接报错。 - 更高效合理的方式是直接累加每个单词截取后的长度,而非先拼接再算长度。
修正后的代码
let arrayWords = ["comput3r-9", "b0dywork-7", "e4rth-1"]; let getTotalCharacters = (x) => x.reduce( (prev, curr) => prev + curr.substring(0, curr.length - 2).length, 0 // 必须设置初始值0,确保prev从数字类型开始累加 ); console.log(getTotalCharacters(arrayWords)); // 输出:20
计算验证
逐个单词核对截取后的长度:
- "comput3r-9" 去掉最后2个字符("-9"),剩余"comput3r",长度为8
- "b0dywork-7" 去掉最后2个字符("-7"),剩余"b0dywork",长度为8
- "e4rth-1" 去掉最后2个字符("-1"),剩余"e4rth",长度为4
总和:8+8+4=20,与代码输出一致。
原代码的“假失效”原因
原代码执行后其实会得到拼接字符串"comput3rb0dyworke4rth",它的length也是20,结果是对的,但逻辑不够直接,且空数组场景下会抛出错误。加上初始值并直接累加长度才是更健壮、高效的写法。
内容的提问来源于stack exchange,提问作者Stalin Thume
相关产品推荐
相关产品推荐

