将句子中每个单词的首字母变为大写字母

4

所以,我想将一个字符串转换为首字母大写的字符串。我已经编写了以下代码,但运行后得到的仍然是小写字符串。请问有谁可以指出我的错误所在吗?非常感谢任何帮助。

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");

这不是你几个小时前问过的同样的问题吗? - Xotic750
3个回答

5

我相信你之前就已经收到了关于这个问题的建议,但使用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");
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"></script>

现在,你的代码出了什么问题?

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'm的长度为3

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 函数。 :) - asakura89
那么如何更改字符串呢?我想你可以创建一个新数组并将其复制到其中,但是在javascript中声明没有预定义大小的数组总是会出现“TypeError:Cannot read property '0' of undefined.”。我能够使用charAt和slice创建一个程序,但只是想知道是否可以通过我的代码进行一些小变化来完成。 - Prateek Taneja
你不能改变字符串,你只能创建一个新的。当然,如果你在编写代码时考虑到这一点,那么它应该可以工作(只要你不添加其他错误)。 - Xotic750

0

我已经更改了你的代码。这将帮助你。。

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");

0

这里是一行代码

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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接