【问题标题】:JavaScript titleCase function without regex没有正则表达式的 JavaScript titleCase 函数
【发布时间】:2015-11-17 21:05:05
【问题描述】:

我正在尝试创建一个函数,该函数接受一个字符串并返回一个字符串,其中单词的所有后半部分为大写,其余部分为小写。

这是我所拥有的:

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

titleCase("I'm a little tea pot");

例如,它应该将“我的名字是 nikos”更改为“我的名字是 Nikos”

为什么上面的代码不起作用?

【问题讨论】:

标签: javascript string


【解决方案1】:

在您的 for 循环中,您需要在循环中分配一个值,如下所示:

strAr[i] = strAr[i].charAt(0).toUpperCase();

另一种(稍微更有条理)的方法:我们将创建一个函数来获取一个单词并将其大写,然后我们将创建一个函数来获取一个字符串,将其拆分为空格,将每个单词大写并重新连接和返回字符串。使用titleCase('hi there')在你自己的字符串上使用它

function capitalize(str) {
  if(str.length == 0) return str;
  return str[0].toUpperCase() + str.substr(1);
}

function titleCase(str) {
  return str.split(' ').map(capitalize).join(' ');
}

【讨论】:

    【解决方案2】:

    你需要为你的字符串做一个赋值,所以第一个大写字母然后字符串的其余部分为小写:

    strAr[i] = strAr[i].charAt(0).toUpperCase() + strAr[i].substring(1).toLowerCase();   
    

    注意strAr[i].charAt(0).toUpperCase() 的值只会将第一个字符作为大写字母返回,它实际上不会以任何方式改变字符串。

    Here is a simple example

    【讨论】:

    • 这是唯一正确的答案,因为它是回答“我不明白为什么上面的代码不起作用”问题的唯一答案。其他人只是给出了不同的解决方案。
    • @AtheistP3ace 谢谢,我实际上没有注意到其余项目需要转换为小写(如果还没有),已修复。所以现在这是一个正确的答案:)
    【解决方案3】:

    它不起作用,因为您仍然需要分配 strAr[i].charAt(0).toUpperCase() 的结果:

    strAr[i] = strAr[i].charAt(0).toUpperCase() + strAr[i].slice(1);
    

    值得指出的是.toUpperCase()/.toLowerCase() 方法do not mutate/alter the value of the string(这就是你需要分配它的原因)。您可以将代码简化为以下内容:

    Example Here

    function titleCase(str) {
        var strAr = str.toLowerCase().split(' ');
        for (var i = 0; i < strAr.length; i++) {
            strAr[i] = strAr[i].charAt(0).toUpperCase() + strAr[i].slice(1);
        }
        return strAr.join(' ');
    }
    
    console.log(titleCase('This is a simple test.'));
    // This Is A Simple Test.
    

    除了您所写的内容之外,您还可以使用以下内容:

    Example Here

    function titleCase (str) {
      return str.toLowerCase().replace(/(^|\s)(\w)/g, function(x) {
        return x.toUpperCase();
      });
    }
    
    console.log(titleCase('This is a simple test.'));
    // This Is A Simple Test.
    

    它将整个输入字符串转换为小写,然后将空格后面的所有字符大写(基于匹配)。

    【讨论】:

      【解决方案4】:

      扩展 String 类:

      用 toUpperCase 的版本替换每个单词。

      String.prototype.capitalize = function() {
          return this.replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); });
      };
      
      
      console.log("jose maria gonzales".capitalize()); 
      // Jose Maria Gonzales
      

      【讨论】:

      【解决方案5】:

      使用下面的 ucword 代码

              function titleCase(str) {
                  return (str + '')
                      .replace(/^([a-z\u00E0-\u00FC])|\s+([a-z\u00E0-\u00FC])/g, function($1) {
                          return $1.toUpperCase();
                      });
              }
      
              var data = titleCase("I'm a little tea pot");
              document.write(data);
      

      【讨论】:

        【解决方案6】:
        function titleCase(str) {
          str = str.split(' ');
          var title ="";
          var result = [];
          for(var i = 0; i < str.length; i++){
            title = str[i].toLowerCase();
            result.push(title[0].toUpperCase()+title.slice(1));
          }
          return result.join(' ');
        }
        console.log(titleCase('This is a simple test.'));
        // This Is A Simple Test.
        

        真的很容易理解和贯彻...

        【讨论】:

        • 除了上面的代码之外,请解释为什么这是解决问题的正确方法。查看How to Answer,了解有关提供良好答案的更多详细信息。
        猜你喜欢
        • 1970-01-01
        • 2017-08-16
        • 2016-06-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 2017-09-18
        相关资源
        最近更新 更多