我的挑战是将字符串中每个单词的第一个字母大写,同时确保所有其他字母都是小写的。我花了更多的时间,然后我愿意承认这一点,我的代码如下所示。它完成了大约95%。
唯一的缺陷是它会像“我是”那样将收缩归还为“我是”。出于某种原因,它将收缩视为两个单独的词。我在第一个字母大写的步骤之后立即测试了我的一个console.log(我已在示例中对其进行了评论)。它返回它在同一步骤中将“I”和“M”都大写。如何让它只改变“我”?
function titleCase(str) {
str = str.toLowerCase(); //make everything lowercase
str = str.split(" "); //make the string to array
for(i = 0; i < str.length; i++){
var strItem = str[i]; //take item in array
strItem = strItem.replace(/\b./g, function(m){ return m.toUpperCase(); }); //capitalize it
//console.log(strItem);
str[i] = strItem; //put changed item back into array
}
str = str.join(" "); //turn array back into string
return str;
}
titleCase("I'm a little tea pot");
感谢您的时间。
答案 0 :(得分:2)
我的建议是,您使用<string>.charAt(<index>)
来获取字符串的第一个字母,而<string>.slice(<index>)
可以为您提供字符串的一部分。
提示:在接受每个单词后,您可以使用charAt()
取大写字母的第一个字母,然后取出字符串的剩余部分并将其小写。
更新:
答案:
function upperFirstLetterInWords(str) {
var totalString = "";
//Take words from sentence -
//Use regex /\s+/g for many spaces in sentence.
var words = str.split(" ");
//Take each word...
//Using for loop as we have an array and it is
//more efficient than foreach loop or lambda.
for(var i = 0; i < words.length; ++i) {
//Make your changes here.javascript:;
totalString += words[i].charAt(0).toUpperCase() +
words[i].slice(1).toLowerCase() +
" ";
}
//Remove last space.
return totalString.trim();
}
console.log(upperFirstLetterInWords("I'm A LitTle TEa POt."));
答案 1 :(得分:2)
您的问题似乎是您在替换表达式中使用全局匹配。
删除g
。
function titleCase(str) {
str = str.toLowerCase(); // Make everything lowercase
str = str.split(/\s+/); // Make the string to array
for (var i = 0; i < str.length; i++) {
var strItem = str[i]; // Take item in array
strItem = strItem.replace(/\b./,
function(m) {
return m.toUpperCase(); // Capitalize it
}
);
str[i] = strItem; // Put changed item back into array
}
return str.join(" "); // Turn array back into string
}
document.body.innerHTML = titleCase("I'm a little tea pot");
您可以创建一个capitalCase
函数,并将其用作每个单词的映射(回调)函数。
function titleCase(str) {
return str.split(/\s+/).map(captitalCase).join(' ');
}
function captitalCase(str) {
return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase();
}
document.body.innerHTML = titleCase("I'm a little tea pot");
如果要保留空白区域,可以将所有序列非空白字符替换为各自的capitalCase
等效字符。
function titleCase(str) {
return str.replace(/(\S+)/g, function(m) {
return captitalCase(m);
});
}
function captitalCase(str) {
return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase();
}
document.body.innerHTML = titleCase("I'm a little \n tea pot");
body {
white-space: pre;
}
答案 2 :(得分:0)
出于好奇,我想看看我是否可以在不使用正则表达式的情况下提出替代的javascript解决方案:
var selectedParagraph = document.getElementsByTagName('p')[1];
var textUC = [];
function toTitleCase(element) {
var textLC = element.innerHTML.toLowerCase().split(' ');
for (var i = 0; i < textLC.length; i++) {
textUC[i] = textLC[i].substr(0,1).toUpperCase() + textLC[i].substr(1);}
element.innerHTML = textUC.join(' ');
}
window.onload = toTitleCase(selectedParagraph);
&#13;
<p>I'm a little tea pot</p>
<p>I'm a little tea pot</p>
&#13;