Free Code Camp:Title Case A Sentence挑战JS代码问题排查
问题分析与解决方案:Title Case a Sentence 挑战
嘿,我来帮你排查下这个问题的根源!你的代码里有几个容易踩的字符串操作坑,导致第二个条件没生效,咱们一步步来看:
核心问题点
字符串是不可变的,方法返回新值而非原地修改
你写的str.toLocaleLowerCase();其实执行了,但没有把返回的全小写字符串重新赋值给str,所以后续的拆分操作还是基于原字符串的字符,根本没完成全局转小写的步骤。
同样,letter.toUpperCase();这行只是生成了一个大写的新字符,但你没把这个结果赋值回letter,所以letterArray[i]还是原来的字符,相当于没做任何修改。遗漏了非首字母的小写处理
你的代码只关注了单词首字母的大写逻辑,但没有把其他字母统一转成小写——如果原字符串里有大写字母(比如示例里的"I'm"),这些字母不会被修正为小写。
修复后的代码(基于你的原逻辑)
我们把上面的坑填上,就能得到正确的结果:
function titleCase(str) { // 把全小写的字符串赋值回str,覆盖原字符串 str = str.toLocaleLowerCase(); var letterArray = str.split(""); for (var i = 0; i < letterArray.length; i++) { if (i === 0) { // 直接将首字母大写后赋值回数组 letterArray[0] = letterArray[0].toUpperCase(); } else if (letterArray[i - 1] === " ") { // 空格后的字母大写后赋值回数组 letterArray[i] = letterArray[i].toUpperCase(); } } return letterArray.join(""); } titleCase("I'm a little tea pot"); // 返回 "I'm A Little Tea Pot"
更简洁的实现方案
如果想让逻辑更清晰,也可以把字符串拆成单词数组来处理,每个单词单独做首字母大写:
function titleCase(str) { return str.toLowerCase().split(' ').map(word => { // 兼容连续空格的情况(避免word为undefined) return word ? word[0].toUpperCase() + word.slice(1) : word; }).join(' '); }
这个写法先把整个字符串转小写,拆成单词后,每个单词取首字母大写,再拼接剩余的小写字母,最后把单词数组重新拼成字符串,逻辑更直观,还能处理连续空格的边界场景。
内容的提问来源于stack exchange,提问作者Alon Parag
相关产品推荐
相关产品推荐

