我正在尝试将字符串中每个单词的第一个字母替换为大写,并通过拆分字符串然后映射每个单词来使其工作,如下所示:
var S = 'hello world';
var x = S.toLowerCase().split(' ').map(word => word[0].toUpperCase() + word.substr(1)).join(' ');
console.log(x);
如果字符串包含多个空格,如下所示,则会出现错误 Cannot read property 'toUpperCase' of undefined
。
var S = 'hello world';
var x = S.toLowerCase().split(' ').map(word => word[0].toUpperCase() + word.substr(1)).join(' ');
console.log(x);
我尝试将+
添加到.split('')和.join(''),如过去的stackoverflow线程中所建议的,如下所示,但仅这样做将第一个单词的第一个字母大写:
var S = 'hello world';
var x = S.toLowerCase().split(' +').map(word => word[0].toUpperCase() + word.substr(1)).join(' +');
console.log(x); // returns 'Hello world'
什么是正确的方法呢?
答案 0 :(得分:3)
您可以使用String.replace()
和RegExp将每个单词的第一个字符替换为大写版本:
var S = 'hello world';
var x = S.toLowerCase().replace(/\b\w/g, (m) => m.toUpperCase());
console.log(x);
如果您仍想使用String.split()
,请使用RegExp,并将数组拆分为\s+
(一系列空格 - 空格,制表符等等):
var S = 'hello world';
var x = S.toLowerCase().split(/\s+/).map(word => word[0].toUpperCase() + word.substr(1)).join(' ');
console.log(x);
答案 1 :(得分:1)
首先应该使用正则表达式删除重复的空格。
var S = 'hello world';
var x = S.replace(/ +/g, ' ').toLowerCase().split(' ').map(word => word[0].toUpperCase() + word.substr(1)).join(' ');
但是如果你想保留这些空间你可能想要使用
var S = 'hello world';
var x = S.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1);});
答案 2 :(得分:1)
您得到的错误是因为您正在访问空字符串的第一个字符,以下结果相同:
word = ''
word[0].toUppercase() ...
当字符串为空时你必须处理这种情况
word === '' ? word : word[0].toUppercase() ...