2017-02-21 19 views
0

文字列のすべての単語の最初の文字を大文字にすることを試みています。私は3つのステップでそれをやりたかった:単語の最初の文字を大文字にすることはできません

  1. 文字列を.split()を使って配列に変換する。
  2. ループを作成し、配列インデックスを使用してすべての単語の最初の文字を変更します。
  3. 最後に、すべてを文字列に戻すために.joinを使用したかったのです。

しかし、何かがうまくいかず、私は第3ステップに行くことができません。 forループは文字を大文字に変換しますが、変数capを返すと、文字列の最後の単語の最初の大文字の文字だけが返されます。この例ではP(最後の単語はポット)ですが、ポットを消去するとTが返されます(茶は最後の単語になります)。

なぜキャップ変数は大文字の最初の文字で配列全体を返しませんか?私は何が欠けていますか?

ここでは、コードです:

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

可能な複製(http://stackoverflow.com/questions/196972/convert-string- to-title-case-with-javascript) –

+1

現在の単語の最初の文字を '' var cap = "に設定しているので、ループが完了すると、' cap'は最後の文字の最初の文字に設定されますワード。 – Santi

+0

これは、CSSで簡単にできることのオーバーヘッドです。 .myclass { text-transform:capitalize; } – Korgrue

答えて

3

あなただけの(最後の繰り返しにより左)大文字への最後の言葉最初の文字が含まれていますキャップ変数を返しているためです。

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

私はこれが答えだと思う:

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

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

+1

あなたが本当に巧妙な解決法で役立つようにしようとしているのか、些細な質問に賢い解決策を求めている人を混同しようとしているのかどうかわからない:) –

+0

余分なものを使わずにこの問題を解決する他の方法を示したい –

1

capが唯一の変数であるので、それはの最初の文字で上書き取得し続けてあなたの言葉を通して、あなたループようにです次の言葉。それを配列にするか、次の文字をその上に連結します。

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

あなたはJavascriptの枢機卿の罪を犯しています!ループ内で変数を宣言しないでください。

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回だけです。

しかし、これはあなたの問題ではまだ間違っています。これは、文字列全体が必要な場合にのみ、単一の文字を与えます。この問題を解決するためのはるかにエレガントな方法がありますが、この

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

のようなものを試してみてください、しかし、ここで壊れうまくいけば、すべてのステップは、あなたのループがやっているし、やるべきかを理解するのに役立ちます。

幸運を祈る!

0

ES2015ソリューション:

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

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

の作業例:[JavaScriptを使用してタイトルケースに文字列を変換]のhttps://jsfiddle.net/ecdkxrjd/

関連する問題