只收缩收缩中的第一个字母

时间:2015-11-17 14:10:01

标签: javascript string

我的挑战是将字符串中每个单词的第一个字母大写,同时确保所有其他字母都是小写的。我花了更多的时间,然后我愿意承认这一点,我的代码如下所示。它完成了大约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");

感谢您的时间。

3 个答案:

答案 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解决方案:

&#13;
&#13;
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;
&#13;
&#13;