我正在解决CoderByte的一些问题。此函数的目标是获取一个字符串并将每个单词的首字母大写。例如,'Hello World'
到'hello world'
。我无法弄清楚为什么这段代码会给我'Hello World'
而不是array[i][0] = array[i][0].toUpperCase();
。我知道这一行function LetterCapitalize(str) {
var array = str.split(' ');
for (var i = 0; i < array.length; i++) {
array[i][0] = array[i][0].toUpperCase();
}
return array.join('');
}
LetterCapitalize('hello world');
是问题,但不明白为什么它不起作用。我想出了一个替代解决方案,但我想知道为什么这不起作用。非常感谢你的帮助!
{{1}}
答案 0 :(得分:2)
问题是array[i]
引用了一个字符串。但是,strings are immutable in JavaScript,因此此操作失败:array[i][0] = array[i][0].toUpperCase()
。您不能在字符串上设置单个索引。
要完成您想要的操作,您必须创建一个首字母大写的 new 字符串。这是一种方法,借用另一种SO post:
function capitalizeFirstLetter(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
function capitalizeAllWords(str) {
var words = str.split(' ');
return words.map(capitalizeFirstLetter).join(' ');
}
capitalizeAllWords('hello world');
答案 1 :(得分:1)
在这种情况下,你可以使用正则表达式:
function LetterCapitalize(str) {
var regex = /(\b[a-z](?!\s))/g;
str = str.replace(regex, function(x) {
return x.toUpperCase();
});
console.log(str);
}
LetterCapitalize('hello world');
答案 2 :(得分:1)
处理此问题的有效方法是使用.map()函数
function cap(string){
return string.split(" ").map(function(word){
return word.charAt(0).toUpperCase() + word.slice(1)
}
}
并逐步指导代码:
.split(“”)通过在每次有空格时添加新项目来生成数组
.map()接受一个值,将其插入一个函数,并根据函数返回的内容修改结果。
.charAt(0)得到第一个字母和 .toUpperCase()将其大写
.slice(1)获取第一个字母后的每个字母。
干杯, TheGenieOfTruth
(在手机上完成,因此格式不稳定且代码未经测试)
答案 3 :(得分:0)
您没有创建二维数组。不能使用[0]引用 - 必须使用子串。
注意substr(第二个参数是一个长度 - 我们只想要1个字符)和substring(其中第二个参数是结束位置 - 这里省略,因此转到字符串结尾)之间的区别。
function LetterCapitalize(str) {
var array = str.split(' ');
for (var i = 0; i < array.length; i++) {
var firstChar = array[i].substr(0,1).toUpperCase();
if array[i].length == 1
array[i]=firstChar;
else
array[i]=firstChar + array[i].substring(1);
}
return array.join(' ');
}
LetterCapitalize('hello world');
答案 4 :(得分:0)
采用功能性方法:
var capitalize = function(str) {
return str.split(/\s+/)
.map(function(word) {
return word.charAt(0).toUpperCase() + word.slice(1);
})
.join(' ');
};
作为奖励,此功能还将\n
(换行符)和\t
(制表符)字符作为大写字母边界。
答案 5 :(得分:-1)
试试这个:
function LetterCapitalize(str) {
var array = str.split(' ');
for (var i = 0; i < array.length; i++) {
array[i] = array[i][0].toUpperCase()+array[i].slice(1);
}
return array.join(' ');
}
LetterCapitalize('hello world');