预期空字符串在 Javascript 中返回 false

问题描述 投票:0回答:2

我正在尝试解决 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

我不明白为什么会出现此错误,因为我已经包含了空字符串检查。

javascript string operators equals
2个回答
0
投票

代码的问题是它在修剪后不检查输入字符串是否为空。因此,如果输入字符串仅包含空白字符,该函数仍会继续生成主题标签,这不是我们想要的。

试试,

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。否则,返回主题标签。


0
投票

有两个问题:

  • 当输入仅包含空格时,结果将 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.