每个单词的首字母大写,无法按预期工作。

3

首先我知道这不是正确的做法,但我想了解为什么会发生这种情况,以便更好地理解这门语言。

function titleCase(str) {
  let str1 = str.toLowerCase();
  str1 = str1.replace(str1[0], str1[0].toUpperCase());
  console.log(str1);

  for(let i=1; i < str1.length; i++){
    if(str1[i]===' '){
      str1 = str1.replace(str1[i+1], str1[i+1].toUpperCase());
      console.log(i);
      console.log(str1);
    }
  }
  return str1;
}

titleCase("ab cd ef gh ba");

因此,如果最后一个单词的第一个字母未在它之前的任何单词的倒数第二个字母中出现,则正常工作。"ab cd ef gh" 没有问题,但 "ab cd ef gh ba" 会产生以下输出:"AB Cd Ef Gh ba"等等... 谢谢!

你的函数逻辑不正确。你需要重新考虑一下。 - AhmadWabbi
记录一下,这个函数可以改进为:titleCase = str => str.replace(/\b[a-z]/, x=>x.toUpperCase()); - Niet the Dark Absol
我会说 replace 不是你想象中的那样。它不接受索引,而是接受一个字符串值(或单个字符),并替换其第一次出现 - Bergi
我猜当你提到你知道这不是正确的做法时,这就是你所暗示的内容,但只是为了万一它不是:Python有一种简单的方法可以做到这一点:https://docs.python.org/3/library/stdtypes.html#str.title - Kevin Wang
3个回答

1

对于这种字符串替换,我更倾向于使用正则表达式

将/\b(.)/g用作第一个字母的模式,\U$0用作替换字符串,应该可以按预期工作

这是一个演示链接

https://regex101.com/r/qQ2dE4/423


1
这种情况发生的原因是.replace()函数只会替换第一个出现的内容。
"Tell us more about your question us"

第一次找到空格时,它将替换第一个出现的小写字母“u”,这恰好是正确的:

"Tell us more about your question us"
//    ^ this "u" happens to be the first occurrence

但是当它遇到最后一个单词“us”时,它会再次尝试查找小写字母“u”的第一次出现,这个字母是在单词“about”中间的那个。
"Tell Us More About Your Question us"
//               ^ this "u" is now the first lowercase "u"

0

这将替换字符串中第一个出现的字符。因此先前位置的字符可能也会被替换。

str1 = str1.replace(str1[i+1], str1[i+1].toUpperCase());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接