为什么这会失败?我应该(以某种方式)逃避信i
- 这不会与其他角色失败。
titleCase("I'm a little tea pot");
// Prints: "i'm A Little Tea Pot"
// Expected: "I'm A Little Tea Pot"
function titleCase(str) {
return str.split(' ').map(function(each) {
return each.toLowerCase().replace(each[0], each[0].toUpperCase());
}).join(' ');
}
答案 0 :(得分:3)
.toLowerCase()
发生在each
的原始值上,因此.replace()
可能/不会给您预期的结果。
如果将其拆分为单独的语句,它应该按预期工作:
function titleCase(str) {
return str.split(' ').map(function(each) {
each = each.toLowerCase();
return each.replace(each[0], each[0].toUpperCase());
}).join(' ');
}
作为一种更有效的方法,最好将.toLowerCase()
移到.map()
调用之前,这样只需要调用一次,而不是每个字一次:< / p>
function titleCase(str) {
str = str.toLowerCase();
return str.split(' ').map(function(each) {
return each.replace(each[0], each[0].toUpperCase());
}).join(' ');
}
答案 1 :(得分:1)
对于“我是”字符串的一部分,大写“I”转换为小写“i”并尝试用大写的“I”替换小写的“i”,这在字符串中甚至不存在。
所以在开头修改了你的函数,用小写字母转换整个字符串。
请查看下面的工作代码段。
console.log(titleCase("I'm a little tea pot"));
// Prints: "i'm A Little Tea Pot"
// Expected: "I'm A Little Tea Pot"
function titleCase(str) {
str = str.toLowerCase();
return str.split(' ').map(function(each) {
//console.log(each[0].toUpperCase());
return each.toLowerCase().replace(each[0], each[0].toUpperCase());
}).join(' ');
}
答案 2 :(得分:1)
您可以尝试这样的事情:
function titleCase(str) {
return str.split(' ').map(function(each) {
return each.charAt(0).toUpperCase() + each.substring(1).toLowerCase();
}).join(' ');
}
console.log(titleCase("I'm a little tea pot"));
function titleCase(str) {
return str.split(' ').reduce(function(p,c) {
return p + " " + toTitle(c);
});
}
function toTitle(str){
return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase();
}
console.log(titleCase("I'm a little tea pot"));
答案 3 :(得分:1)
运行以下代码段并查看输出。
var each ="I'm";
console.log(`Change ${each[0]} to ${each[0].toUpperCase()} in ${each.toLowerCase()}`);
console.log('Result:', each.toLowerCase().replace(each[0], each[0].toUpperCase()));
您应该看到要搜索的字符是大写字母“I”,但字符串中的第一个字符是小写字母“i”。
function titleCase(str) {
return str.toLowerCase().split(' ').map(function(each) {
return each.replace(each[0], each[0].toUpperCase());
}).join(' ');
}
console.log(titleCase("I\'m a little tea pot"));
// Prints: "i'm A Little Tea Pot"
// Expected: "I'm A Little Tea Pot"
答案 4 :(得分:0)
很简单。
replace(each[0], each[0].toUpperCase());
只会替换lowerCase
个项目,而I
不会lowercase
,因为each[0]
尚未被替换。
对于句子中的其他单词,它们的第一个字符是小写的,因此在lowercase()
上调用each
后它们会保持小写。
答案 5 :(得分:0)
您也可以使用正则表达式。
function titleCase(str) {
return str.replace(/(?:^|\s)\w/g, function(match) {
return match.toUpperCase();
});
}
答案 6 :(得分:0)
toLowerCase
返回一个新字符串,它不会更新each
的值。因此,当"I'm"
分配给each
时,您实际获得的是:
"i'm".replace("I", "I".toUpperCase());
"I"
不在字符串"i'm"
中,因此不会替换任何内容。
不是拆分字符串,而是在每个令牌上运行替换并加入它,而是使用replace
RegExp和replacement function来执行此操作:
function titleCase (str) {
var upper = function (wholeMatch, before, firstLetter) {
return before + firstLetter.toUpperCase();
};
return (str.toLowerCase()).replace(/(^\s*|\s+)(.)/g, upper);
}
titleCase("I'm a little tEa pot");
// "I'm A Little Tea Pot"
titleCase(" I'm a little tEa pot");
// " I'm A Little Tea Pot"
titleCase(" I'm a little tEa pot");
" I'm A Little Tea Pot"
/(^\s*|\s+)(.)/g
找到字符串的开头(带有可选的空格)或空格后跟任何单个字符。然后upper
函数将字符大写,并返回任何捕获的空格和大写字符作为替换。