CodeWars哈希标签生成器:空字符串判断返回错误问题求助
解决CodeWars《The Hashtag Generator》挑战的问题
挑战详情
我正在解决CodeWars的代码挑战《The Hashtag Generator》,挑战规则如下:
- 结果必须以哈希标签(
#)开头 - 所有单词首字母必须大写
- 若最终结果长度超过140字符,返回
false - 若输入为空,或处理后的结果为空字符串,返回
false
示例
" Hello there thanks for trying my Kata" => "#HelloThereThanksForTryingMyKata" " Hello World " => "#HelloWorld" "" => false
我的代码
function generateHashtag (str) { if (str == "") {return false;} else { let text = str.trim(); const myArray = text.split(" "); let mot =""; let finalStr = "" for(let i=0; i< myArray.length; i++) { mot = myArray[i]; mot = mot.charAt(0).toUpperCase() + mot.slice(1); finalStr =finalStr + mot; } if(finalStr.length >140){return false;} else {return "#"+finalStr;} } }
遇到的问题
预期空字符串返回false:期望返回false但得到了'#'
我已经加了空字符串检查,但不知道为什么会触发这个错误。
问题分析与修复
你的代码存在两个关键问题:
- 仅检查了完全空的输入:当输入是全空格字符串(比如
" ")时,str == ""不成立,会进入else分支,但trim()后得到空字符串,最终生成#,违反了“结果为空则返回false”的规则。 - split分割多空格会产生空元素:比如输入
"Hello World",split(" ")会得到["Hello", "", "", "World"],循环处理空元素时,会把空字符串拼接进去,虽然不影响最终结果,但如果输入全是空格,就会导致finalStr为空,返回#。
修正后的代码:
function generateHashtag(str) { // 先去除两端空格,判断处理后是否为空(覆盖空输入和全空格输入) const trimmedStr = str.trim(); if (!trimmedStr) return false; // 分割单词并过滤空元素,再统一处理首字母大写 const finalStr = trimmedStr .split(" ") .filter(word => word) .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(""); // 检查长度是否超标 if (finalStr.length > 140) return false; return "#" + finalStr; }
修正说明
- 先通过
trim()处理输入,直接判断处理后的字符串是否为空,同时覆盖了空输入和全空格输入的情况。 - 使用
filter(word => word)过滤掉split(" ")产生的空元素,避免无效拼接。 - 用
map和join简化了首字母大写的逻辑,代码更简洁易读。 - 最后严格检查长度,确保符合规则。
内容的提问来源于stack exchange,提问作者ABDELKEBIR ACHRAF
相关产品推荐
相关产品推荐

