【问题标题】:Title Case a Sentence [duplicate]标题案例一个句子[重复]
【发布时间】:2015-12-26 06:26:24
【问题描述】:

所以,我想将一个字符串转换为标题大小写字符串。我已经编写了这段代码,但是当我运行它时,我得到了相同的小写字符串。谁能指出我在哪里错了?任何帮助深表感谢。

function capitalize(str) {
    return str.toUpperCase();
}

function titleCase(str1) {
    str1 = str1.toLowerCase();
    var arr = str1.split(' ');
    var l = arr.length;
    var m;

    for (var i = 0; i < l; i++) {
        m = arr[i].length;
        for (var j = 0; j < m; j++) {
            if (j === 0) {
                arr[i][0] = capitalize(arr[i][0]);
            }
            else {
                arr[i][j] = arr[i][j];
            }
        }
    }
    return arr;
}

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

【问题讨论】:

  • 这不是你几个小时前问的同一个问题吗?

标签: javascript string


【解决方案1】:

我很确定您之前就这个问题得到了建议,但使用的是 ES5 方法(您可以自己将其降级为 for 循环)。

function titleCase(str1) {
  return str1.toLowerCase().split(' ').map(function(word) {
    return word.charAt(0).toUpperCase() + word.slice(1);
  }).join(' ');
}
document.body.textContent = titleCase("I'm a little tea potty");
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"&gt;&lt;/script&gt;

现在,你的代码怎么了?

function capitalize(str) {
  return str.toUpperCase();
}
function titleCase(str1) {
  str1 = str1.toLowerCase();
  var arr = str1.split(' ');
  var l = arr.length;
  var m;

  for (var i = 0; i < l; i++) {
    m = arr[i].length;
    for (var j = 0; j < m; j++) {
      if (j === 0) {
        arr[i][0] = capitalize(arr[i][0]);
      } else {
        arr[i][j] = arr[i][j];
      }
    }
  }
  return arr;
}
document.body.textContent = titleCase("I'm a little tea potty");

让我们一点一点来看看:

function capitalize(str) {
  return str.toUpperCase();
}

上面没有错,只是功能化似乎毫无意义。

所以,现在我们有了你的函数,你接受一个参数(一个字符串),然后你把它全部小写

function titleCase(str1) {
  str1 = str1.toLowerCase();

所以你的字符串"I'm a little tea potty" 出现了,它变成了"i'm a little tea potty"。到现在为止还挺好。然后你在空格处分割它。

  var arr = str1.split(' ');
  var l = arr.length;
  var m;

随之而来的是你的字符串,变成var arr = ["i'm","a","little","tea","potty"];l变成5,这个数组的长度。 接下来你打算循环遍历数组arr,看起来不错

for (var i = 0; i < l; i++) {

所以对于数组(迭代)中的每个单词(一个字符串),你得到字符串的长度,第一个i'm3

m = arr[i].length;

然后你打算迭代单词中的每个字符,这样就可以了

for (var j = 0; j < m; j++) {

那么,如果它是单词的第一个字符,那么我想要一个大写字母,否则什么都不做。

  if (j === 0) {
    arr[i][0] = capitalize(arr[i][0]);
  } else {
    arr[i][j] = arr[i][j];
  }

但问题是,您尝试将字符写回字符串,这是不可变的。没有错误被抛出,只是没有任何变化,就像字符串有一个只读开关,就像在存储卡上一样。因此,您的循环将继续进行,什么也不做,直到一切都完成。然后你返回数组。

return arr;

令人惊讶的是,这与将句子拆分为单词时一样。 ["i'm","a","little","tea","potty"]

【讨论】:

  • map 函数被使用。 :)
  • 那么你如何改变字符串呢?我想您可以创建一个新数组并将其复制到其中,但是在没有预定义大小的 javascript 中声明数组总是会引发“TypeError:无法读取未定义的属性 '0'”。我能够使用 charAt 和 slice 创建一个程序,但只是想知道是否可以通过我的代码中的一些小变化来完成。
  • 你不能改变字符串,你创建一个新的。当然,如果您考虑到这一点来更改代码,那么它应该可以工作(只要您不添加其他错误)。
【解决方案2】:

我已更改您的代码。这会帮助你..

function capitalize(str) {
    return str.toUpperCase();   
}

function titleCase(str1) {
    str1 = str1.toLowerCase();
    var arr = str1.split(' ');
    var l = arr.length;
    var m;  

    for (var i = 0; i < l; i++) {
        m = arr[i].length;
        arr[i] = capitalize(arr[i][0])+arr[i].substr(1);        
    }   
    return arr; 

}

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

【讨论】:

    【解决方案3】:

    这里有一个班轮

    function titleCase(str) {
        return str.split(' ').map(function(s){
           return s.slice(0, 1).toUpperCase() + s.slice(1);
        }).join(' ');
    }
    
    titleCase("I'm a little tea potty");
    

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2018-12-29
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多