【问题标题】:Trying to capitalize the first character in array of strings, why this is not working?尝试将字符串数组中的第一个字符大写,为什么这不起作用?
【发布时间】:2011-12-06 07:31:16
【问题描述】:

我正在尝试编写一个函数,例如将list-style-image 转换为listStyleImage

我想出了一个功能,但它似乎不起作用。谁能指出我这里的问题?

var myStr = "list-style-image";

function camelize(str){
    var newStr = "";    
    var newArr = [];
    if(str.indexOf("-") != -1){
        newArr = str.split("-");
        for(var i = 1 ; i < newArr.length ; i++){
            newArr[i].charAt(0).toUpperCase();
        }       
        newStr = newArr.join("");
    }
    return newStr;
}

console.log(camelize(myStr));

【问题讨论】:

标签: javascript arrays string character capitalization


【解决方案1】:

这是我使用 slice() 方法的解决方案。

const names = ["alice", "bob", "charlie", "danielle"]

const capitalized = names.map((name) => {
    return name[0].toUpperCase() + name.slice(1)

})

console.log(大写)

// 预期输出: // [“爱丽丝”,“鲍勃”,“查理”,“丹妮尔”]

【讨论】:

    【解决方案2】:

    请检查下面的代码

     var months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'november', 'decembar'];
    
    for(let month of months){
        month = month.charAt(0).toUpperCase() + month.substr(1);
        console.log(month);
    }
    

    【讨论】:

      【解决方案3】:

      让我们看看下面的代码。

      ['sun','mon'].reduce((a,e)=> { a.push(e.charAt(0).toUpperCase()+e.substr(1)); return a; },[]);
      

      输出: ["Sun", "Mon"]

      【讨论】:

        【解决方案4】:

        这就是我的做法。

        function capitalizeFirst(arr) {
          if (arr.length === 1) {
            return [arr[0].toUpperCase()];
          }
          let newArr = [];
          for (let val of arr) {
            let value = val.split("");
            let newVal = [value[0].toUpperCase(), ...value.slice(1)];
            newArr.push(newVal.join(""));
          }
          return newArr;
        }
        

        【讨论】:

          【解决方案5】:
          const days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
          
          days.map( a => a.charAt(0).toUpperCase() + a.substr(1) );
          

          【讨论】:

          • 您应该考虑添加一些解释,以及正确格式化您发布的代码。
          【解决方案6】:

          虽然我玩得太晚了,但这是另一个解决方案。

          const days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
          
          let capitalize = days.map(day => day.charAt(0).toUpperCase() + day.slice(1).toLowerCase());
          
          console.log(capitalize);

          【讨论】:

            【解决方案7】:

            从 JavaScript ES6 开始,您可以用一行代码实现字符串数组的“骆驼化”:

            let newArrCamel= newArr.map(item=> item.charAt(0).toUpperCase() + item.substr(1).toLowerCase())
            

            【讨论】:

              【解决方案8】:

              substr() 方法返回字符串的起始索引和后面的字符数之间的部分。来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr

              const days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
              for (let day of days) {
                day = day.substr(0, 1).toUpperCase() + day.substr(1);
                console.log(day);
              }

              【讨论】:

                【解决方案9】:

                这是我使用 ES6 的解决方案。这是一个示例,我将星期几存储在数组中,并使用 for... of 循环将它们大写。

                const days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
                
                for (let day of days) {
                    day = day.charAt(0).toUpperCase() + day.substr(1);
                    console.log(day);
                }
                

                这里是文档的链接:for... of loop documentation

                【讨论】:

                  【解决方案10】:
                  function titleCase(str){    // my codelooks like Jmorazano but i only use 4 var.
                  var array1 = [];
                  var array2 = []; 
                  var array3 = "";
                  var i;
                  array1 = str.split(" ");
                  for (i=0; i < array1.length; i++) {
                  array1[i]= array1[i].toLowerCase();
                  array2=array1[i].split("");
                  array2[0]=array2[0].toUpperCase();
                  array3 = array2.join("");
                  array1[i] = array3;}
                  
                  str = array1.join(' ');
                  return str;}
                  titleCase("I AM WhO i aM"); //Output:I Am Who I Am
                  // my 1st post.
                  

                  【讨论】:

                    【解决方案11】:

                    你实际上必须重新分配数组元素:

                        for(var i = 1 ; i < newArr.length ; i++){
                            newArr[i] = newArr[i].charAt(0).toUpperCase();
                        }       
                    

                    “toUpperCase()”函数返回新字符串但不修改原始字符串。

                    您可能需要先检查以确保 newArr[i] 是空字符串,以防您得到一个带有两个连续破折号的输入字符串。

                    edit — 著名的 SO 贡献者 @lonesomeday 正确地指出,您还需要将每个字符串的其余部分粘回去:

                             newArr[i] = newArr[i].charAt(0).toUpperCase() + newArr[i].substr(1);
                    

                    【讨论】:

                    • 这给了listSI。你需要+ newArr[i].substr(1)
                    • 如果从 1 开始迭代数组,当它只是数组中的单个元素时,表达式将不会被应用。循环应该有var i = 0
                    • @TeoDragovic 原来的问题想跳过第一个字符;换句话说,像“a”这样的单个字符值应该产生相同的字符串“a”。
                    • 您需要使用 charAt 还是可以跳过这一步?
                    • @coder123 如果您愿意,可以使用newArr[i][0].toUpperCase()
                    【解决方案12】:

                    有点长,但它基本上完成了使用数组的工作:

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

                    【讨论】:

                      【解决方案13】:

                      您需要将大写字母存储回数组中。请参考下面修改后的循环,

                      for(var i = 1 ; i < newArr.length ; i++)
                      {
                          newArr[i] = newArr[i].charAt(0).toUpperCase() + newArr[i].substr(1,newArr[i].length-1);
                      }
                      

                      【讨论】:

                        【解决方案14】:

                        你不需要数组来用大写替换连字符和小写字母-

                        function camelCase(s){
                            var rx=  /\-([a-z])/g;
                            if(s=== s.toUpperCase()) s= s.toLowerCase();
                            return s.replace(rx, function(a, b){
                                return b.toUpperCase();
                            });
                        }
                        
                        camelCase("list-style-image")
                        
                        /*  returned value: (String)
                        listStyleImage
                        */
                        

                        【讨论】:

                          【解决方案15】:

                          在您的 for 循环中,您需要替换 newArr[i] 的值,而不是简单地评估它:

                          for(var i = 1 ; i < newArr.length ; i++){
                              newArr[i] = newArr[i].charAt(0).toUpperCase() + newArr[i].substr(1);
                          }
                          

                          【讨论】:

                            猜你喜欢
                            • 2019-02-09
                            • 2015-08-06
                            • 2019-05-20
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-11-30
                            • 2020-07-04
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多