只大写缩略词的第一个字母

3

我的挑战是在保证所有其他字母小写的情况下,将字符串中每个单词的首字母大写。我为此花费了比我愿意承认的更多时间,并且我的代码如下所示。它只有一个缺陷,就是会将“我是”这样的缩写词返回为“I'M”。由于某种原因,它将缩写词视为两个单独的单词。我通过在将首字母大写的步骤后立即放置console.log进行测试(我已在示例中注释掉了它)。它返回在同一步骤中同时将“I”和“M”变成大写。如何使其仅更改“我”的字母大小写呢?

function titleCase(str) {

  str = str.toLowerCase(); //make everything lowercase
  str = str.split(" "); //make the string to array

  for(i = 0; i < str.length; i++){
    var strItem = str[i]; //take item in array
    strItem = strItem.replace(/\b./g, function(m){ return m.toUpperCase(); }); //capitalize it
   //console.log(strItem);
   str[i] = strItem; //put changed item back into array
  }

  str = str.join(" "); //turn array back into string
  return str;
}

titleCase("I'm a little tea pot");

感谢您的时间。

快速提问,你的挑战必须使用JavaScript吗?例如,你能用CSS来实现text-transform:capitalize吗? - Mike Sav
3个回答

2
我建议使用<string>.charAt(<index>)来获取字符串的第一个字母,使用<string>.slice(<index>)可以获得字符串的一部分。

提示:在获取每个单词后,您可以使用charAt()获取第一个字母,大写它,然后获取剩余的字符串并将其小写。

更新:

答案:

function upperFirstLetterInWords(str) {

  var totalString = "";
  //Take words from sentence - 
  //Use regex /\s+/g for many spaces in sentence.
  var words = str.split(" "); 

  //Take each word...
  //Using for loop as we have an array and it is
  //more efficient than foreach loop or lambda.
  for(var i = 0; i < words.length; ++i) {
     //Make your changes here.javascript:;
     totalString += words[i].charAt(0).toUpperCase() +
            words[i].slice(1).toLowerCase()  +
            " ";
  }

  //Remove last space.
  return totalString.trim();

}

console.log(upperFirstLetterInWords("I'm A LitTle TEa POt."));


1
不留言就点踩是一种不好的态度。请留下评论,这样我才能变得更好。谢谢。 - Nick Louloudakis
3
即使是作业,OP也已尽力而为,但无法完成。提供完整解决方案就可以了。(虽然我不是那个给你点了踩的人) - Madara's Ghost
1
如果你不打算给出完整的答案,那就只需添加一条评论。 - Luciano
1
感谢。正在尝试应用.charAt()和.slice()。这不是作业,而是一个freecodecamp的挑战。该网站似乎采取了一种强制自学的教学方法来教授Web开发。 - Wes Schumaker-Reid
2
我建议您测试(和修复)代码,如果解决方案无效,则无法摆脱负投票。 - musefan
显示剩余4条评论

2
您的问题似乎是您在替换表达式中使用了全局匹配。请删除 g

function titleCase(str) {
  str = str.toLowerCase();               // Make everything lowercase
  str = str.split(/\s+/);                // Make the string to array  
  for (var i = 0; i < str.length; i++) {
    var strItem = str[i];                // Take item in array
    strItem = strItem.replace(/\b./,
        function(m) {
              return m.toUpperCase();    // Capitalize it
        }
    );                           
    str[i] = strItem;                    // Put changed item back into array
  }
    
  return str.join(" ");                  // Turn array back into string
}

document.body.innerHTML = titleCase("I'm a little tea pot");

简化版

你可以创建一个 capitalCase 函数,并将其用作每个单词的映射(回调)函数。

function titleCase(str) {
  return str.split(/\s+/).map(captitalCase).join(' ');
}

function captitalCase(str) {
  return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase();
}

document.body.innerHTML = titleCase("I'm a little tea pot");

保留空格

如果您想要保留空格,可以将所有非空格字符序列替换为它们各自的capitalCase等效项。

function titleCase(str) {
  return str.replace(/(\S+)/g, function(m) {
    return captitalCase(m);
  });
}

function captitalCase(str) {
  return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase();
}

document.body.innerHTML = titleCase("I'm   a   little  \n  tea   pot");
body {
  white-space: pre;
}


谢谢。它起作用了!我见过的每个正则表达式都使用了g。我从未想过一个字母会给我带来这么多的挫败感。 - Wes Schumaker-Reid
@WesSchumaker-Reid:g 表示它将替换所有匹配项,如果省略它,则只替换第一个匹配项。在您的情况下,这是可以的。我不知道您的要求,但我认为您不需要依赖单词边界,您可能只需使用起始条件:/^./ - musefan
@WesSchumaker-Reid:我创建了一个额外的方法来保留空格。 - Mr. Polywhirl
如果字符串是 "I'm.a.little.tea.pot",怎么办? - korogui
@korogui:那么它将是无效的。除非特别指定了这个条件,否则它超出了问题的范围,并引入了不必要的复杂性。 - Mr. Polywhirl

0

出于好奇,我想看看是否能够提供一种不使用正则表达式的替代JavaScript解决方案:

var selectedParagraph = document.getElementsByTagName('p')[1];

var textUC = [];

function toTitleCase(element) {
var textLC = element.innerHTML.toLowerCase().split(' ');
for (var i = 0; i < textLC.length; i++) {
textUC[i] = textLC[i].substr(0,1).toUpperCase() + textLC[i].substr(1);}
element.innerHTML = textUC.join(' ');
}

window.onload = toTitleCase(selectedParagraph);
<p>I'm a little tea pot</p>
<p>I'm a little tea pot</p>


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