【问题标题】:Title case a sentence?标题案例一个句子?
【发布时间】:2015-10-08 07:42:07
【问题描述】:

我正在尝试在 javascript 中正确区分字符串 - 到目前为止,我有以下代码: 这似乎没有将第一个字母大写,而且我还纠结于如何将第一个字母之后的所有字母小写。

function titleCase(str) {
  var newstr = str.split(" ");
  for(i=0;i<newstr.length;i++){
    newstr[i].charAt(0).toUpperCase();

  }
   newstr = newstr.join(" ");
   return newstr;
}  

明确地说,我希望句子中的每个单词都大写。

【问题讨论】:

  • 您只是错过了将 newstr[i] 分配给新值的首字母大写。并在拆分之前将 str 小写。
  • stackoverflow.com/questions/1026069/… - 好的优雅的解决方案
  • @Reflective 非常相似但不完全相同的问题。这个问题的作者想要单词的其余部分小写的初始大写,而在您链接的问题中,作者想要单词的其余部分保持不变的初始大写。
  • @natalie 我发现了一个类似的问题,stackoverflow.com/questions/4878756/…你也可以使用正则表达式!

标签: javascript


【解决方案1】:

我能想到的最简洁的方法之一,使用 ES6,但仍然缺少正确的 .capitalize() 字符串原型方法:

let sent = "these are just some words on paper"
sent.split(' ').map ( ([h, ...t]) => h.toUpperCase() + t.join('').toLowerCase() )

对数组元素字符串使用解构以通过扩展运算符(使尾部成为字符序列)获得头部和尾部,这些运算符在强制转换为小写之前首先连接。或者你可以用s =&gt; s[0].toUpperCase() + s.substring(1).toLowerCase() 替换它,我猜。哦,因为这个问题似乎表明了 ES5,所以转换很便宜,虽然明显更冗长:

function capitalize (sentence) {
    return sentence.split(' ').map(
        function (s) {
            return s[0].toUpperCase() + s.substring(1).toLowerCase()      
        }).join(' ') ;
}

也就是说,假设您希望返回另一个句子。

【讨论】:

  • 仅供参考:ES6 方法在映射后缺少 .join(' ') 以将其转换为句子。
【解决方案2】:

这应该可行。请注意我如何将 newstr[i] 设置为所需的输出。 .toUpperCase() 之类的函数不会影响原始字符串。它们只返回具有所需属性的 new 字符串。

function titleCase(str) {
  var newstr = str.split(" ");
  for(i=0;i<newstr.length;i++){
    if(newstr[i] == "") continue;
    var copy = newstr[i].substring(1).toLowerCase();
    newstr[i] = newstr[i][0].toUpperCase() + copy;
  }
   newstr = newstr.join(" ");
   return newstr;
}  

【讨论】:

  • 我认为您的代码很好,但您在每次迭代期间都创建了一个 copy 变量。我建议您在循环之前声明您的 copy 变量并在循环中使用新值对其进行初始化。
  • @RexOverflow 在 for 循环内外声明变量之间存在actually no difference,因为变量声明是在解析时计算的,而不是在运行时计算的。
  • @MaximillianLaumeister 谢谢:D 有用的资源。
【解决方案3】:

这是一段工作代码。您的代码中有问题的行是这一行:

newstr[i].charAt(0).toUpperCase();

该行获取每个单词的大写首字母,但它不做任何事情。下面代码的工作方式是将第一个字符大写,然后附加单词的其余部分,然后将其分配回newstr[i]

function titleCase(str) {
  var newstr = str.split(" ");
  for(i=0;i<newstr.length;i++){
    newstr[i] = newstr[i].charAt(0).toUpperCase() + newstr[i].substring(1).toLowerCase();
  }
   newstr = newstr.join(" ");
   return newstr;
}

【讨论】:

  • 他想将first字母大写,如果单词则将其余字母小写。有点Camel-casing
  • newstr[i].substring(1) 其余部分不是小写。如果我通过“HELLO WORLD!”怎么办?到函数?
  • 感谢您的解释!唯一的事情是我还必须在你的 substring(1) 之后添加 .toLowerCase()
  • @RexOverflow 哦,哎呀,我的错!我只是用全小写的句子测试我的例子——我明白你现在在说什么。我编辑了我的答案来解决这个问题。
【解决方案4】:

如果你喜欢像我一样使用Ramda,你可以做这个干净有趣的事情:

import { concat, compose, head, join, map, split, tail, toLower, toUpper } from 'ramda';    
const toWords = split(' ');
const capitalizeWords = map(s => concat(toUpper(head(s)), toLower(tail(s))));
const toSentence = join(' ');
const toTitleCase = compose(toSentence, capitalizeWords, toWords);

当然,你也可以把它缩减到

const capitalizeWords = map(s => concat(toUpper(head(s)), toLower(tail(s))));
const toTitleCase = compose(join(' '), capitalizeWords, split(' '));

【讨论】:

  • 如果您的单词尚未用空格分隔,请尝试在 compose 中的第一个(最右侧)操作中添加替换以进行替换。例如,我需要在拆分之前先用空格替换破折号。替换(/-/g, ' ')
【解决方案5】:
function capitalizeFirstLetter(string) {
    return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
}

此函数将字符串的第一个字母大写,其余部分小写。

从这里找到的完美答案稍微改变了功能:How do I make the first letter of a string uppercase in JavaScript?

【讨论】:

    【解决方案6】:

    这是一个function titleCase(string, array),它将字符串转换为标题大小写,除了某些介词、冠词和连词外,每个单词的第一个字母都大写。如果一个单词跟在冒号后面,它总是大写的。您可以包含一个可选数组来忽略您选择的字符串,例如首字母缩略词。

    我可能遗漏了ignore 数组中的一些异常词。随意添加它们。

    function titleCase(str, array){
    
      var arr = [];
      var ignore = ["a", "an", "and", "as", "at", "but", "by", "for", "from", "if", "in", "nor", "on", "of", "off", "or", "out", "over", "the", "to", "vs"];
      if (array) ignore = ignore.concat(array);
      ignore.forEach(function(d){
        ignore.push(sentenceCase(d));
      });
    
      var b = str.split(" ");
    
      return b.forEach(function(d, i){
        arr.push(ignore.indexOf(d) == -1 || b[i-1].endsWith(":") ? sentenceCase(d) : array.indexOf(d) != -1 ? d : d.toLowerCase());
      }), arr.join(" ");
    
      function sentenceCase(x){
        return x.toString().charAt(0).toUpperCase() + x.slice(x.length-(x.length-1));
      }
    
    }
    
    var x = titleCase("james comey to remain on as FBI director", ["FBI"]);
    console.log(x); // James Comey to Remain on as FBI Director
    var y = titleCase("maintaining substance data: an example");
    console.log(y); // Maintaining Substance Data: An Example
    

    【讨论】:

    • 正在寻找这份了不起的工作!
    【解决方案7】:
    const titleCase = str => {
        let string = str.toLowerCase().split(" ");
        let arr = [];
        
        string.map(x =>arr.push(x[0].toUpperCase() + x.slice(1))) 
        
        return arr.join(" ");
    }
    

    【讨论】:

    • 如果您解释了您提供的代码如何回答问题,这将是一个更好的答案。
    【解决方案8】:
    function titleCase(str) {
        var titleStr = str.split(' ');
    
        for (var i = 0; i < titleStr.length; i++) {
    
            titleStr[i] = titleStr[i].charAt(0).toUpperCase() + titleStr[i].slice(1).toLowerCase();
    
        }
    
        return titleStr.join(' ');
    }
    
    titleCase("i'm a little tea pot")
    

    【讨论】:

      【解决方案9】:

      我最近使用匹配第一个字母并考虑撇号的正则表达式重新解决了这个问题。希望对您有所帮助:

      function titleCase(str) {
      
      return str.toLowerCase().replace(/^\w|\s\w/g, function(firstLetter) {
          return firstLetter.toUpperCase();
        });
      }
      titleCase("I'm a little tea pot");
      

      【讨论】:

        【解决方案10】:

        我的解决方案

        function titleCase(str) {
        
        var myArr = str.toLowerCase().split(" ");
        
        for (var a = 0; a < myArr.length; a++){
             myArr[a] = myArr[a].charAt(0).toUpperCase() + myArr[a].substr(1);
          }
        
          return myArr.join(" ");
        }
        

        【讨论】:

          【解决方案11】:
          function titleCase(str) {
            var newArr = str.toLowerCase().split(" "), 
            firstLetter, 
            updArr = [];
            for(var i=0;i<newArr.length;i+=1){
              firstLetter = newArr[i].slice(0,1);
              updArr.push(newArr[i].replace(firstLetter, firstLetter.toUpperCase()));
            }
            return updArr.join(" ");
          }
          

          【讨论】:

            【解决方案12】:

            先全部变成小写,然后打开每个单词,再打开每个字母,第一个字母设置大写,然后连在一起

            function titleCase(str) {
              var copy=str;
              copy=copy.toLowerCase();
              copy=copy.split(' ');
              for(var i=0;i<copy.length;i++){
                var cnt=copy[i].split('');
                cnt[0]=cnt[0].toUpperCase();
                copy[i]=cnt.join('');
                
                
              }
              str=copy.join(' ');
              return str;
            }
            
            titleCase("I'm a little tea pot");

            【讨论】:

              【解决方案13】:
              function titleCase(str){
                  var strToArray = str.split(" ");
                  var newArray = [];       
              
                  for(var i=0; i < strToArray.length; i++){
                      var element = strToArray[i].replace(strToArray[i][0], strToArray[i][0].toUpperCase());
                      newArray.push(element);
                  }
              
                  return (newArray.join(" "));
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-04-06
                • 1970-01-01
                • 1970-01-01
                • 2011-04-12
                • 1970-01-01
                • 1970-01-01
                • 2016-08-30
                相关资源
                最近更新 更多