我正在尝试解决 CodeWars 代码挑战标签生成器 :
营销团队花太多时间输入主题标签。
让我们用我们自己的标签生成器帮助他们!这是交易:
- 它必须以主题标签 (
) 开头。#
- 所有单词的第一个字母必须大写。
- 如果最终结果超过 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;}
}
}
这是我得到的错误:
Expected an empty string to return false: expected '#' to equal false
我不明白为什么会出现此错误,因为我已经包含了空字符串检查。
代码的问题是它在修剪后不检查输入字符串是否为空。因此,如果输入字符串仅包含空白字符,该函数仍会继续生成主题标签,这不是我们想要的。
试试,
function generateHashtag(str) {
if (!str.trim()) { // check if the trimmed string is empty
return false;
} else {
const words = str.trim().split(/\s+/); // split the trimmed string into words
const capitalizedWords = words.map(word => word.charAt(0).toUpperCase() + word.slice(1)); // capitalize the first letter of each word
const hashtag = "#" + capitalizedWords.join(""); // join the capitalized words and prepend with #
if (hashtag.length > 140) {
return false;
} else {
return hashtag;
}
}
}
在这里,首先,使用
trim()
方法和逻辑NOT
运算符(!)检查修剪后的字符串是否为空。并使用 regular expression /\s+/
将修剪后的字符串拆分为单词。这使我们能够处理输入字符串包含多个连续空白字符的情况。
然后,使用
map()
方法和字符串连接将每个单词的首字母大写,并使用join()
方法将大写单词连接在一起。最后,在生成的字符串前加上"#"
以生成主题标签。
如果hashtag的长度大于140,和之前一样返回false。否则,返回主题标签。
有两个问题:
当输入仅包含空格时,结果将 also 为空字符串。所以 first 修剪输入,然后才测试空字符串
结果长度的测试是错误的,因为你在before加上
#
符号。所以改考查>= 140
.
这是修正了这两个问题的代码
function generateHashtag (str) {
let text = str.trim(); // Do this first
if (text == "") {return false;}
else
{
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;} // Take "#" into account
else {return "#"+finalStr;}
}
}
这是一个使用正则表达式提取单词的解决方案,并使用
map
和 join
在一个表达式中构建结果:
function generateHashtag (str) {
const result = (str.trim().match(/\S+/g) ?? []).map(word =>
word[0].toUpperCase() + word.slice(1)
).join("");
return !!result && result.length < 140 && "#" + result;
}