关于javascript:无法大写单词的第一个字母

Can't capitalize the first letter of the word

我正在尝试将字符串中每个单词的第一个字母大写。我想分三步完成:

  • 使用.split()将字符串转换为数组。
  • 创建一个循环,并通过使用数组索引对其进行寻址来更改每个单词中的第一个字母。
  • 最后我想用join把所有的东西都放回一个字符串中。
  • 但是出了点问题,我不能走第三步。for循环确实将字母改为大写,但是当我返回变量cap时,它只返回字符串中最后一个单词的第一个大写字母。在这个例子中,它是p(最后一个词是pot),如果我擦掉pot,它会返回t(因为tea变成了最后一个词)。

    为什么cap变量不返回首字母大写的整个数组?我错过了什么?

    代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function titleCase(str) {
      var arr = str.split("");
      for (i = 0; i < arr.length; i++) {
        var cap = arr[i][0].toUpperCase();
      }
      return cap;
    }

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


    这是因为您只是返回cap变量,该变量将包含最后一个单词,第一个字母变为大写(由最后一次迭代留下)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function titleCase(str) {
        var arr = str.split("");

        for (i = 0; i < arr.length; i++) {
            var word = arr[i];
            // capitalized first letter + rest of the word
            var capitalizedWord = word[0].toUpperCase() + word.slice(1);

            arr[i] = capitalizedWord; // replace the uncapitalized word with capitalized one
        }

        return arr.join(""); // join with spaces to make it a sentence again
    }

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

    这是因为cap只是一个变量,所以当你循环你的单词时,它会被下一个单词的第一个字母所覆盖。使其成为数组或将下一个字母连接到它上面。


    ES2015解决方案:

    1
    2
    3
    4
    5
    6
    const titleCase = str =>
      str.split(' ').map(word =>
        word.charAt(0).toUpperCase() + word.slice(1)
      ).join(' ');

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

    工作示例:https://jsfiddle.net/ecdkxrjd/


    你犯了javascript的大罪!不要在循环内声明变量。

    1
    2
    3
    4
    5
    6
    7
    8
    function titleCase(str) {
      var cap;
      var arr = str.split("");
      for (i = 0; i < arr.length; i++) {
        cap = arr[i][0].toUpperCase();
      }
      return cap;
    }

    这是正确的打字方法。

    当for循环在示例中迭代时,它每次都会重新声明变量,这会导致一些不好的事情发生。在我的示例中,它每次都被重新定义,但只声明一次。

    但是,这对于您的问题仍然是不正确的。这只会在需要整个字符串时给您一个字母。试试这个

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function titleCase(str) {
      var arr = str.split("");
      var wordToCap;
      var capWord;
      var capArray = [];
      for (var i = 0; i < arr.length; i++) {
        wordToCap = arr[i];
        capWord = wordToCap.charAt(0).toUpperCase() + wordToCap.substring(1);
        capArray.push(capWord);
      }
      return capArray.join("");
    }

    有很多更优雅的方法来解决这个问题,但希望这里列出的所有步骤都能帮助您理解循环正在做什么,应该做什么。

    祝你好运!


    在每次迭代中,您都要覆盖变量cap。您的代码稍有修改:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function titleCase(str) {
      var arr = str.split("");
      var cap ="";
      for (i = 0; i < arr.length; i++) {
        if (i != arr.length - 1) {
          cap += arr[i][0].toUpperCase() + arr[i].substr(1) +"";
        } else {
          cap += arr[i][0].toUpperCase() + arr[i].substr(1);
        }
      }
      return cap;
    }

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

    我想答案是:

    1
    2
    3
    const capitalizeFirst = data => data.replace(/[\w']+/g, x => x[0].toUpperCase() + x.slice(1).toLowerCase())

    console.log(capitalizeFirst("I'm a little tea pot"))