无法大写单词的第一个字母

时间:2017-02-21 19:56:36

标签: javascript arrays string

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

  1. 使用.split()将字符串转换为数组。
  2. 通过使用数组索引对其进行寻址,创建一个循环并更改每个单词中的第一个字母。
  3. 最后我想用.join将所有内容放回字符串中。
  4. 但出了点问题,我无法进入第3步。 for循环确实将字母更改为大写,但是当我返回变量cap时,它只返回字符串中最后一个单词的第一个大写字母。在示例中它是P(最后一个词是底池),如果我擦除底池它返回T(因为茶成为最后一个单词)。

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

    以下是代码:

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

6 个答案:

答案 0 :(得分:3)

那是因为你只是返回一个cap变量,它将包含最后一个单词的第一个字母大写(左上一个迭代)。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我认为这就是答案:

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

console.log(capitalizeFirst("I'm a little tea pot"))
&#13;
&#13;
&#13;

答案 3 :(得分:0)

您在每次迭代中覆盖变量cap。 您的代码略有修改:

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

答案 4 :(得分:0)

你犯了Javascript的主要罪行!不要在循环中声明变量。

window.onresize = function(){ // may not be the window object
    if (screen.width < 1280) { // many ways of detecting screen width
        var sections = document.querySelectorAll("section"); // create array of all section elements
        for (var i = 0; i <= sections.length-1; i++) { // loop through them
            sections[i].classList.remove("parallax"); // remove their parallax class
        };
    };
};

输入您所写的内容是正确的方法。

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

但是,这对您的问题仍然不正确。这只会在您想要整个字符串时为您提供单个字母。试试这样的事情

function titleCase(str) {
  var cap;
  var arr = str.split(" ");
  for (i = 0; i < arr.length; i++) {
    cap = arr[i][0].toUpperCase();
  }
  return cap;
}

有更优雅的方法来解决这个问题,但希望这里分解的所有步骤都可以帮助你理解你的循环正在做什么和应该做什么。

祝你好运!

答案 5 :(得分:0)

ES2015解决方案:

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/