我试图写一个函数,大写字符串中每个单词的第一个字母(将字符串转换为标题情况)。

例如,当输入是“我是一个小茶壶”时,我期望“我是一个小茶壶”是输出。然而,该函数返回“i'm a little tea pot”。

这是我的代码:

函数标题案例(str) { var splitStr = str.toLowerCase().split(“ ”); for (var i = 0; i < splitStr.length; i++) { if (splitStr.length[i] < splitStr.length) { splitStr[i].charAt(0).toUpperCase(); } str = splitStr.join(“ ”); } 返回 str; } console.log(titleCase(“I'm a Little Teapot”));


当前回答

Let cap = (str) => { Let arr = str.split(' '); 加勒比海盗。forEach(函数(项,索引){ Arr [index] = item。替换(项目[0],[0].toUpperCase ()); }); 加勒比海盗。加入(' '); }; console.log(cap(“我是一个小茶壶”));

快速可读版本参见基准http://jsben.ch/k3JVz

其他回答

我认为这条路会快一些;因为它不会拆分字符串并重新连接;只是用正则表达式。

var str = text.toLowerCase().replace(/(^\w{1})|(\s{1}\w{1})/g, match => match.toUpperCase());

解释:

(^\w{1}):匹配字符串的第一个字符 |:或者 (\s{1}\w{1}):匹配一个空格后面的一个字符 G:全部匹配 match => match. touppercase (): replace with can take function, so;将匹配替换为大写匹配

下面是字符串中每个单词首字母大写的另一种方法。

使用prototype为String对象创建一个自定义方法。

String.prototype.capitalize = function() {
    var c = '';
    var s = this.split(' ');
    for (var i = 0; i < s.length; i++) {
        c+= s[i].charAt(0).toUpperCase() + s[i].slice(1) + ' ';
    }
    return c;
}
var name = "john doe";
document.write(name.capitalize());

最短的一行(也非常快):

 text.replace(/(^\w|\s\w)/g, m => m.toUpperCase());

解释:

^\w:字符串的第一个字符 |:或 \s\w:空格后的第一个字符 (^\w|\s\w)捕捉模式。 g标志:匹配所有出现的情况。


如果你想确保剩下的是小写的:

text.replace(/(^\w|\s\w)(\S*)/g, (_,m1,m2) => m1.toUpperCase()+m2.toLowerCase())

使用示例:

几点toTitleCase = str = > str。replace (/ s (^ w | \ \ w) (s *) / g, (m1, m2) = >的m1 toUpperCase () + m2。toLowerCase () 控制台日志。(toTitleCase(“你好世界”);

如果可行,请使用text-transform: capitalize;CSS属性将文本转换为标题大小写。

如果您可以同样依赖CSS来实现相同的结果,那么与JavaScript选项相比,这种操作成本更低。

《我是一个小茶壶》是以下片段的结果。

<p style="text-transform: capitalize;">I'm a little tea pot</p>

@somethingthere有一个更紧凑(和现代)的重写方案:

let titleCase = (str => str. tolowercase()。(' ') . map(分裂 c => c. charat (0). touppercase () + c.substring(1))。加入(' ')); 文档。write(titleCase(“我是一个更小的茶壶”));