在JS中将每个单词的首字母大写

34

我正在学习如何将字符串中每个单词的首字母大写,对于这个解决方案,除了 word.substr(1) 部分,我都理解。我知道它在添加断开的字符串,但 (1) 是如何起作用的呢?

function toUpper(str) {
return str
    .toLowerCase()
    .split(' ')
    .map(function(word) {
        return word[0].toUpperCase() + word.substr(1);
    })
    .join(' ');
 }
 console.log(toUpper("hello friend"))

8
也许现在是接受这些答案之一的时候了? - ksav
21个回答

41

返回值包含两个部分:

return word[0].toUpperCase() + word.substr(1);
1) word[0].toUpperCase(): 这是将第一个字母变成大写。
2) word.substr(1) 是除了首字母已经被转成大写以外的剩余单词。这是关于substr如何工作的文档。
如果您想要调试,请参考下面的结果:
function toUpper(str) {
return str
    .toLowerCase()
    .split(' ')
    .map(function(word) {
        console.log("First capital letter: "+word[0]);
        console.log("remain letters: "+ word.substr(1));
        return word[0].toUpperCase() + word.substr(1);
    })
    .join(' ');
 }
 console.log(toUpper("hello friend"))


非常好!解释得很清楚,代码也运行良好。 - Frederiko Cesar

19

或者你可以节省大量时间并使用 Lodash

看看
https://lodash.com/docs/4.17.4#startCase -已添加/编辑-
https://lodash.com/docs/4.17.4#capitalize

例如:

-已添加/编辑-
您可能想要使用 startCase,它是另一个用于将每个单词的第一个字母大写的函数。

_.startCase('foo bar'); 
// => 'Foo Bar'

仅对句子的第一个字母进行大写

_.capitalize('FRED');
// => 'Fred'

Lodash是一个美妙的JavaScript库,旨在为您节省大量时间。

在这里,您将找到许多用于字符串、数字、数组、集合等的时间节省函数。

您还可以在客户端或服务器(Node.js)上使用它,使用Bower或Node,CDN或手动包含。


这只会将整个字符串的第一个字母大写 _.capitalize('first second') // => 'First second',而问题说明他想要每个单词的首字母都大写。如果你只是想替换第一个字母,那么你应该明确指出这不是完整的解决方案。 - Tomer Amir
这就是 lodash 的美妙之处,您可以使用 _.startCase('foo bar'); // Foo Bar,或者对于不同的结果,您还有其他函数,例如 _.toUpper('fooBar'); // FOOBAR。 - Pablo Palacios
2
这绝对是最干净、最好的方法。只需使用:_.startCase(_.capitalize('foo bar')),即使你有一个像 FOO BAR 这样的字符串,它也会转换为 Foo Bar - Frederiko Cesar
如果您想删除“-”或“/”,并将字符串大写,那么这也是一个不错的选择。 - YEVY

14

下面是一段快速的代码片段。这段代码片段将允许您使用JavaScript将字符串的第一个字母大写。

function capitlizeText(word) 
{
    return word.charAt(0).toUpperCase() + word.slice(1);
}

13
正则表达式/\b\w/匹配一个单词边界后跟一个单词字符。您可以将其与replace()字符串方法一起使用,以匹配并替换这些字符(没有g(全局)正则表达式标志只替换第一个匹配字符):
> 'hello my name is ...'.replace(/\b\w/, (c) => c.toUpperCase());
'Hello my name is ...'
> 'hello my name is ...'.replace(/\b\w/g, (c) => c.toUpperCase());
'Hello My Name Is ...'


1
请在您的示例旁边添加一些解释。仅仅在代码片段中添加一些正则表达式并不利于理解思路。 - Victor
2
好的。哎呀,抱歉,我以为这很容易理解。 - spinkus
1
应该是被接受的解决方案。不需要任何特殊的软件包,可以实现你想要的功能。 - FreelanceConsultant

7
function titleCase(str) {
  return str.toLowerCase().split(' ').map(x=>x[0].toUpperCase()+x.slice(1)).join(' ');
}

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

6

大部分答案都是解释substr(1)的工作原理。我给你提供了更好的方法来解决你的问题。

   function capitalizeFirstLetters(str){
      return str.toLowerCase().replace(/^\w|\s\w/g, function (letter) {
          return letter.toUpperCase();
      })
    }

说明: - 首先将整个字符串转换为小写 - 其次,检查整个字符串的第一个字母,并检查在它之前有空格字符的第一个字母,并应用 .toUpperCase() 方法进行替换。

Check this example:

function capitalizeFirstLetters(str){
      return str.toLowerCase().replace(/^\w|\s\w/g, function (letter) {
          return letter.toUpperCase();
      })
    }

console.log(capitalizeFirstLetters("a lOt of words separated even   much spaces "))


3
考虑一个具有隐式返回的箭头函数:
word => `${word.charAt(0).toUpperCase()}${word.slice(1).toLowerCase()}` 

以下一行代码即可实现。


2

使用 ES6

let captalizeWord = text => text.toLowerCase().split(' ').map( (i, j) => i.charAt(0).toUpperCase()+i.slice(1)).join(' ')

captalizeWord('cool and cool')

1

substr是一个函数,它从链接的MDN返回包含给定字符串提取部分的新字符串(从您的函数中的第二个字符开始)。还有关于polyfill实现的注释,它添加了获取字符串的子字符串


substr is substring” 是不正确的。你是不是想说 “substr 是 _一个子字符串_”? - Sebastian Simon

1
function titlecase(str){
   let titlecasesentence = str.split(' ');
   titlecasesentence = titlecasesentence.map((word)=>{
     const firstletter = word.charAt(0).toUpperCase();
     word = firstletter.concat(word.slice(1,word.length));

     return word;
});
  titlecasesentence = titlecasesentence.join(' ');
  return titlecasesentence;
}
titlecase('this is how to capitalize the first letter of a word');

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