JavaScriptを使用して、文字列内の各単語の最初の文字を大文字にするにはどうすればよいですか?


116

文字列内のすべての単語の最初の文字を大文字にする関数を作成しようとしています(文字列をタイトルケースに変換します)。

たとえば、入力がの"I'm a little tea pot"場合、私"I'm A Little Tea Pot"は出力になることを期待しています。ただし、関数はを返します"i'm a little tea pot"

これは私のコードです:

function titleCase(str) {
  var splitStr = str.toLowerCase().split(" ");

  for (var i = 0; i < splitStr.length; i++) {
    if (splitStr.length[i] < splitStr.length) {
      splitStr[i].charAt(0).toUpperCase();
    }

    str = splitStr.join(" ");
  }

  return str;
}

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


これは、文字列の最初の文字を大文字にしているようには見えません。または、文字列に含まれる各単語を大文字にしたいという意味ですか。
epascarello 2015

2
あなたはあなたの結果にあなたの大文字を割り当てていません、splitStr[i].charAt(0).toUpperCase();そうなるでしょうvoid。あなたはする必要がありますsplitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].substring(1);
何か

1
最初に教えてください。その機能の何問題になっていますか?期待される結果は何ですか?代わりに何が返されますか?
セバスチャンサイモン

この関数は、すべての単語の最初の文字を大文字にしようとしているように見えます。
ハルシオン2015

3
タイトルが言うように、私は文字列の各単語の最初の文字を大文字にしようとしています。私は、本質的に支持的であると思われるフォーラムでの反対票や否定性に感謝しません。@ somethinghere-ご回答ありがとうございます。
slurrr 2015

回答:


164

変更をアレイに再度割り当てることはないため、すべての努力は無駄になります。これを試して:

function titleCase(str) {
   var splitStr = str.toLowerCase().split(' ');
   for (var i = 0; i < splitStr.length; i++) {
       // You do not need to check if i is larger than splitStr length, as your for does that for you
       // Assign it back to the array
       splitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].substring(1);     
   }
   // Directly return the joined string
   return splitStr.join(' '); 
}

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


@Halcyonこれは、単語ごとに1文字になります。
epascarello 2015

14
:ES6では、ビットよりよいに見えるそれはこの、行うことができますmyStr.toLowerCase().split(' ').map(word => word.charAt(0).toUpperCase() + word.substring(1)).join(' ');
パトリックMichaelsen

1
@PatrickMichaelsen確かにできます。答えは変えませんが、2015年からです。時代が変わったことは知っていますが、後世のためにそれを維持します。また、私ももうこのように書くことはありません:)しかし、私が推測するあなた自身の答えとしてあなたのものを投稿してください?
somethinghere

1
はい、同意します。現在の回答は問題ありません。そのため、単に新しい訪問者を参照するために、コメントに入れました。
Patrick Michaelsen

1
この関数のベンチマークを3つの競合他社の関数に対して実行したところ、最もパフォーマンスが高いことがわかりました。最悪の競合他社(Chrome 73)の実行時間の1/3未満です。jsben.ch/AkHgP
マイケル・トンプソン

92

あなたは複雑なものを非常に簡単なものにしています。これをCSSに追加できます。

.capitalize {
    text-transform: capitalize;
}

JavaScriptでは、クラスを要素に追加できます

 document.getElementById("element").className = "capitalize";

@epascarelloわかりません、何を言ってるの?
マルコスペレスグード2015

質問は「この関数の何が問題になっていますか?」です。そうでない場合、これはstackoverflow.com/questions/1026069/…またはstackoverflow.com/questions/196972/…の
Hacketo 2015

1
返事をありがとう、私はMarcosPérezGude@練習のために、この使用してJavaScriptをやろうとしています
slurrr

1
ええ、それは本当に用途が
広いです

3
残念ながら、値が20mmで大文字を使用すると、20Mmになる場合があります。場合によっては、javascriptが唯一の方法である可能性があります。
しかし、

79

ECMAScript 6バージョン:

const toTitleCase = (phrase) => {
  return phrase
    .toLowerCase()
    .split(' ')
    .map(word => word.charAt(0).toUpperCase() + word.slice(1))
    .join(' ');
};

let result = toTitleCase('maRy hAd a lIttLe LaMb');
console.log(result);


1
またtoLowerCase()、ユーザーまたは文字列が大文字と小文字が混在している場合に備えて、最初は欠落していると思います。
ArchNoob 2018年

45

この方法の方が速いはずだと思います。文字列を分割して再度結合しないためです。正規表現を使用するだけです。

var str = text.replace(/(^\w{1})|(\s{1}\w{1})/g, match => match.toUpperCase());

説明

  1. (^\w{1}):文字列の最初の文字に一致
  2. |:または
  3. (\s{1}\w{1}):1つのスペースの後に来る1つの文字に一致します
  4. g:すべて一致
  5. match => match.toUpperCase():replace withは関数を取ることができるので、; 一致を大文字の一致に置き換えます

1
とてもきれいです!
クリフホール

なぜ\s{1}ですか?私は言うだろう\s+、それは単語の間にいくつかのスペースでさえも動作しますので、
クリスティアントレイニャ

私の場合; それはちょうど1つのスペースであり、そうです。それはうまくいくはずです!
nimeresam

文字列は不変です。正規表現は、内部で分割および結合されます。実際にはそれを回避する方法はありません。
bluegrounds

24

サードパーティのライブラリを使用できる場合、Lodashにはヘルパー関数があります。

https://lodash.com/docs/4.17.3#startCase

_.startCase('foo bar');
// => 'Foo Bar'

_.startCase('--foo-bar--');
// => 'Foo Bar'

_.startCase('fooBar');
// => 'Foo Bar'

_.startCase('__FOO_BAR__');
// => 'FOO BAR'
<script src="https://cdn.jsdelivr.net/lodash/4.17.3/lodash.min.js"></script>


19

ECMAScript 6では、矢印関数を使用した1行の回答:

const captialize = words => words.split(' ').map( w =>  w.substring(0,1).toUpperCase()+ w.substring(1)).join(' ')

3
いいね!を使用w[0]してさらに短くすることができます。正規表現とは異なり、任意の記号で簡単に拡張できますが、space。だけではありません。どんなことで私が意味する( [ "文字が、同様にこれらの記号の後に大文字にする必要がありますので、。だからあなたの解決策に感謝します!
SystemsRebooter19年

17

最短のワンライナー(これも非常に高速):

 text.replace(/(^\w|\s\w)/g, m => m.toUpperCase());

説明:

  • ^\w :文字列の最初の文字
  • | :または
  • \s\w :空白の後の最初の文字
  • (^\w|\s\w) パターンをキャプチャします。
  • g フラグ:すべてのオカレンスに一致します。

残りが小文字であることを確認したい場合:

text.replace(/(^\w|\s\w)(\S*)/g, (_,m1,m2) => m1.toUpperCase()+m2.toLowerCase())

これはすごい!正規表現は最高です。この部分が何をするのかについてもっと詳しく説明できますか?m => m.toUpperCase()
marcin2x4

1
@ marcin2x4mは最初の文字と一致するため、最初の文字は大文字になります。
ニワトリ

12

ECMAScript 6バージョン:

title
    .split(/ /g).map(word =>
        `${word.substring(0,1).toUpperCase()}${word.substring(1)}`)
    .join(" ");

6
私は今これを見ただけで、かなりきれいですが、の" "代わりにを使用して参加する必要があると思います""。そうしないと、1つの大きな単語が表示されますね。
何か

9

𝗙𝗮𝘀𝘁𝗲𝘀𝘁𝗦𝗼𝗹𝘂𝘁𝗶𝗼𝗻𝗙𝗼𝗿𝗟𝗮𝘁𝗶𝗻

正規表現関数を使用して、各文字の大文字を変更するだけです。V8 JISTの最適化により、これは高速でメモリ効率が高いことが証明されるはずです。

// Only works on Latin-I strings
'tHe VeRy LOOong StRINg'.replace(/\b[a-z]|['_][a-z]|\B[A-Z]/g, function(x){return x[0]==="'"||x[0]==="_"?x:String.fromCharCode(x.charCodeAt(0)^32)})

または、関数として:

// Only works for Latin-I strings
var fromCharCode = String.fromCharCode;
var firstLetterOfWordRegExp = /\b[a-z]|['_][a-z]|\B[A-Z]/g;
function toLatin1UpperCase(x){ // avoid frequent anonymous inline functions
    var charCode = x.charCodeAt(0);
    return charCode===39 ? x : fromCharCode(charCode^32);
}
function titleCase(string){
    return string.replace(firstLetterOfWordRegExp, toLatin1UpperCase);
}

このベンチマークによると、コードはChromeの次善のソリューションより33%以上高速です。


𝗗𝗲𝗺𝗼

<textarea id="input" type="text">I'm a little tea pot</textarea><br /><br />
<textarea id="output" type="text" readonly=""></textarea>
<script>
(function(){
    "use strict"
    var fromCode = String.fromCharCode;
    function upper(x){return x[0]==="'"?x:fromCode(x.charCodeAt(0) ^ 32)}
    (input.oninput = function(){
      output.value = input.value.replace(/\b[a-z]|['_][a-z]|\B[A-Z]/g, upper);
    })();
})();
</script>


次のように関数にreturnを追加するのを忘れました:function autoCaps(string){return string.replace(/ \ b [az] | \ B [AZ] / g、function(x){return String.fromCharCode(x.charCodeAt (0)^ 32);}); }
Archy 2018

@Archy訂正ありがとうございます。私はあなたが提案した変更を加えました。
ジャックギフィン


6

また、良いオプションです(特に、freeCodeCampを使用している場合)。

function titleCase(str) {
  var wordsArray = str.toLowerCase().split(/\s+/);
  var upperCased = wordsArray.map(function(word) {
    return word.charAt(0).toUpperCase() + word.substr(1);
  });
  return upperCased.join(" ");
}

5

このルーチンは、ハイフンでつながれた単語とアポストロフィ付きの単語を処理します。

function titleCase(txt) {
    var firstLtr = 0;
    for (var i = 0;i < text.length;i++) {
        if (i == 0 &&/[a-zA-Z]/.test(text.charAt(i)))
            firstLtr = 2;
        if (firstLtr == 0 &&/[a-zA-Z]/.test(text.charAt(i)))
            firstLtr = 2;
        if (firstLtr == 1 &&/[^a-zA-Z]/.test(text.charAt(i))){
            if (text.charAt(i) == "'") {
                if (i + 2 == text.length &&/[a-zA-Z]/.test(text.charAt(i + 1)))
                    firstLtr = 3;
                else if (i + 2 < text.length &&/[^a-zA-Z]/.test(text.charAt(i + 2)))
                    firstLtr = 3;
            }
        if (firstLtr == 3)
            firstLtr = 1;
        else
            firstLtr = 0;
        }
        if (firstLtr == 2) {
            firstLtr = 1;
            text = text.substr(0, i) + text.charAt(i).toUpperCase() + text.substr(i + 1);
        }
        else {
            text = text.substr(0, i) + text.charAt(i).toLowerCase() + text.substr(i + 1);
        }
    }
}

titleCase("pAt o'Neil's");
// returns "Pat O'Neil's";


4

let cap = (str) => {
  let arr = str.split(' ');
  arr.forEach(function(item, index) {
    arr[index] = item.replace(item[0], item[0].toUpperCase());
  });

  return arr.join(' ');
};

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

高速読み取り可能バージョンはベンチマークhttp://jsben.ch/k3JVzを参照してください ここに画像の説明を入力してください


4

ES6構文

const captilizeAllWords = (sentence) => {
  if (typeof sentence !== "string") return sentence;
  return sentence.split(' ')
    .map(word => word.charAt(0).toUpperCase() + word.slice(1))
    .join(' ');
}


captilizeAllWords('Something is going on here')

word.slice(1)をword.slice(1).toLowerCase()に置き換えて、残りが大文字にならないようにする必要があります(元の文にあった場合に備えて)。
アントンクリュッグ

4

あなたはあなたの人生をはるかに楽にすることができる現代のJS構文を使うことができます。与えられた問題のコードスニペットは次のとおりです。

const capitalizeString = string => string.split(' ').map(item => item.replace(item.charAt(0), item.charAt(0).toUpperCase())).join(' ');
capitalizeString('Hi! i am aditya shrivastwa')


3

私は通常、読みやすさのために正規表現を使用しないことを好みます。また、ループを避けようとします。これはちょっと読みやすいと思います。

function capitalizeFirstLetter(string) {
    return string && string.charAt(0).toUpperCase() + string.substring(1);
};

3

以下の関数は、すべての単語の最初の文字すべてを(つまり、正規表現の定義によって\w+)大文字に変換しようとする以外に、文字列の他の部分を変更しません。

つまり、必ずしも単語をTitlecaseに変換するわけでありませが、質問のタイトルにある「文字列内の各単語の最初の文字を大文字にする-JavaScript」とまったく同じように変換します。

  • 文字列を分割しないでください
  • に相当する正規表現によって各単語を決定します\w+[A-Za-z0-9_]+
    • String.prototype.toUpperCase()各単語の最初の文字にのみ関数を適用します。
function first_char_to_uppercase(argument) {
  return argument.replace(/\w+/g, function(word) {
    return word.charAt(0).toUpperCase() + word.slice(1);
  });
}

例:

first_char_to_uppercase("I'm a little tea pot");
// "I'M A Little Tea Pot"
// This may look wrong to you, but was the intended result for me
// You may wanna extend the regex to get the result you desire, e.g., /[\w']+/

first_char_to_uppercase("maRy hAd a lIttLe LaMb");
// "MaRy HAd A LIttLe LaMb"
// Again, it does not convert words to Titlecase

first_char_to_uppercase(
  "ExampleX: CamelCase/UPPERCASE&lowercase,exampleY:N0=apples"
);
// "ExampleX: CamelCase/UPPERCASE&Lowercase,ExampleY:N0=Apples"

first_char_to_uppercase("…n1=orangesFromSPAIN&&n2!='a sub-string inside'");
// "…N1=OrangesFromSPAIN&&N2!='A Sub-String Inside'"

first_char_to_uppercase("snake_case_example_.Train-case-example…");
// "Snake_case_example_.Train-Case-Example…"
// Note that underscore _ is part of the RegEx \w+

first_char_to_uppercase(
  "Capitalize First Letter of each word in a String - JavaScript"
);
// "Capitalize First Letter Of Each Word In A String - JavaScript"

編集2019-02-07:実際のタイトルケースが必要な場合(つまり、最初の文字だけを大文字にし、他のすべてを小文字にする):

function titlecase_all_words(argument) {
  return argument.replace(/\w+/g, function(word) {
    return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
  });
}

両方を示す例:

test_phrases = [
  "I'm a little tea pot",
  "maRy hAd a lIttLe LaMb",
  "ExampleX: CamelCase/UPPERCASE&lowercase,exampleY:N0=apples",
  "…n1=orangesFromSPAIN&&n2!='a sub-string inside'",
  "snake_case_example_.Train-case-example…",
  "Capitalize First Letter of each word in a String - JavaScript"
];
for (el in test_phrases) {
  let phrase = test_phrases[el];
  console.log(
    phrase,
    "<- input phrase\n",
    first_char_to_uppercase(phrase),
    "<- first_char_to_uppercase\n",
    titlecase_all_words(phrase),
    "<- titlecase_all_words\n "
  );
}

// I'm a little tea pot <- input phrase
// I'M A Little Tea Pot <- first_char_to_uppercase
// I'M A Little Tea Pot <- titlecase_all_words

// maRy hAd a lIttLe LaMb <- input phrase
// MaRy HAd A LIttLe LaMb <- first_char_to_uppercase
// Mary Had A Little Lamb <- titlecase_all_words

// ExampleX: CamelCase/UPPERCASE&lowercase,exampleY:N0=apples <- input phrase
// ExampleX: CamelCase/UPPERCASE&Lowercase,ExampleY:N0=Apples <- first_char_to_uppercase
// Examplex: Camelcase/Uppercase&Lowercase,Exampley:N0=Apples <- titlecase_all_words

// …n1=orangesFromSPAIN&&n2!='a sub-string inside' <- input phrase
// …N1=OrangesFromSPAIN&&N2!='A Sub-String Inside' <- first_char_to_uppercase
// …N1=Orangesfromspain&&N2!='A Sub-String Inside' <- titlecase_all_words

// snake_case_example_.Train-case-example… <- input phrase
// Snake_case_example_.Train-Case-Example… <- first_char_to_uppercase
// Snake_case_example_.Train-Case-Example… <- titlecase_all_words

// Capitalize First Letter of each word in a String - JavaScript <- input phrase
// Capitalize First Letter Of Each Word In A String - JavaScript <- first_char_to_uppercase
// Capitalize First Letter Of Each Word In A String - Javascript <- titlecase_all_words

3
function titleCase(str) {

    var myString = str.toLowerCase().split(' ');
    for (var i = 0; i < myString.length; i++) {
        var subString = myString[i].split('');
        for (var j = 0; j < subString.length; j++) {
            subString[0] = subString[0].toUpperCase();
        }
        myString[i] = subString.join('');
    }

    return myString.join(' ');
}

1
あなたの答えにいくつかのコメントを追加してください。
HDJEMAI 2016

3

または、replace()を使用して実行し、各単語の最初の文字を「upperCase」に置き換えることもできます。

function titleCase(str) {
    return str.toLowerCase().split(' ').map(function(word) {
               return word.replace(word[0], word[0].toUpperCase());
           }).join(' ');
}

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

2

map基本的に関数を使用してそれを行う方法は次のとおりfor-loopです。受け入れられた回答と同じですが、はありません。したがって、数行のコードを節約できます。

function titleCase(text) {
  if (!text) return text;
  if (typeof text !== 'string') throw "invalid argument";

  return text.toLowerCase().split(' ').map(value => {
    return value.charAt(0).toUpperCase() + value.substring(1);
  }).join(' ');
}

console.log(titleCase("I'm A little tea pot"));


2

以下は、文字列内の各単語の最初のアルファベットを大文字にする別の方法です。

を使用して、Stringオブジェクトのカスタムメソッドを作成しますprototype

String.prototype.capitalize = function() {
    var c = '';
    var s = this.split(' ');
    for (var i = 0; i < s.length; i++) {
        c+= s[i].charAt(0).toUpperCase() + s[i].slice(1) + ' ';
    }
    return c;
}
var name = "john doe";
document.write(name.capitalize());

1

@somethingthereが提案したソリューションのよりコンパクトな(そして最新の)書き直し:

let titleCase = (str => str.toLowerCase().split(' ').map(
                c => c.charAt(0).toUpperCase() + c.substring(1)).join(' '));
    
document.write(titleCase("I'm an even smaller tea pot"));


1

生のコード:

function capi(str) {
    var s2 = str.trim().toLowerCase().split(' ');
    var s3 = [];
    s2.forEach(function(elem, i) {
        s3.push(elem.charAt(0).toUpperCase().concat(elem.substring(1)));
    });
    return s3.join(' ');
}
capi('JavaScript string exasd');

もう少し詳しく説明する必要があります(何が問題だったのですか?)
2017年

1

replace()は正規表現で使用しました:

function titleCase(str) {

  var newStr = str.toLowerCase().replace(/./, (x) => x.toUpperCase()).replace(/[^']\b\w/g, (y) => y.toUpperCase());

  console.log(newStr);
}

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

1

完全でシンプルなソリューションはここにあります:

String.prototype.replaceAt=function(index, replacement) {
        return this.substr(0, index) + replacement+ this.substr(index
  + replacement.length);
}
var str = 'k j g           u              i l  p';
function capitalizeAndRemoveMoreThanOneSpaceInAString() {
    for(let i  = 0; i < str.length-1; i++) {
        if(str[i] === ' ' && str[i+1] !== '')
            str = str.replaceAt(i+1, str[i+1].toUpperCase());
    }
    return str.replaceAt(0, str[0].toUpperCase()).replace(/\s+/g, ' ');
}
console.log(capitalizeAndRemoveMoreThanOneSpaceInAString(str));

このメソッドが呼び出されるたびにString.prototypeを修正するのはなぜですか?どちらかといえば、一度それを行う必要があり、できれば組み込みのプロトタイプには決して触れないでください。それは少し
何かここで

1
let str = "I'm a little tea pot";

str = str.toLowerCase();

そしてtext-transform: capitalize;、それぞれの要素にcssプロパティを追加します。


0

以下のコードを確認してください。

function titleCase(str) {
  var splitStr = str.toLowerCase().split(' ');
  var nstr = ""; 
  for (var i = 0; i < splitStr.length; i++) {
    nstr +=  (splitStr[i].charAt(0).toUpperCase()+ splitStr[i].slice(1) + " 
    ");
  }
  console.log(nstr);
}

var strng = "this is a new demo for checking the string";
titleCase(strng);

2
このコードスニペットをありがとうございます。これは、限られた即時のヘルプを提供する可能性があります。適切な説明が大幅に長期的な価値を向上させるだろう示すことによって、なぜこれが問題に良い解決策であり、他の、同様の質問を将来の読者にそれがより便利になるだろう。あなたが行った仮定を含むいくつかの説明を追加するためにあなたの答えを編集してください。
iBug

0

ECMA2017またはES8現在

const titleCase = (string) => {
  return string
    .split(' ')
    .map(word => word.substr(0,1).toUpperCase() + word.substr(1,word.length))
    .join(' ');
};

let result = titleCase('test test test');
console.log(result);

説明:
1。最初に、文字列「testtesttest」を関数「titleCase」に渡します。
2.文字列をスペースベースで分割して、最初の関数「split」の結果が["test"、 "test"、 "test"]になるようにし
ます。3。配列を取得したので、各単語の操作にマップ関数を使用しました。配列内。最初の文字を大文字にして、残りの文字を追加します。
4.最後に、文字列をsapceで分割するときに、スペースを使用して配列を結合します。


分割する前の最初の段階で何かが足りないと思いますtoLowerCase()。それはです。
ArchNoob 2018年

@ArchNoob、はい、分割する前にtoLowerCase()を追加できます。ただし、「teSttest」入力に「TeStTest」出力が必要かどうかなど、ユースケースに完全に依存します。この場合、toLowerCase()を追加することはできません。
Pulkit Aggarwal 2018

0

function titleCase(str) {
  //First of all, lets make all the characters lower case
  let lowerCaseString = "";
  for (let i = 0; i < str.length; i++) {
    lowerCaseString = lowerCaseString + str[i].toLowerCase();
  }
  //Now lets make the first character in the string and the character after the empty character upper case and leave therest as it is
  let i = 0;
  let upperCaseString = "";
  while (i < lowerCaseString.length) {
    if (i == 0) {
      upperCaseString = upperCaseString + lowerCaseString[i].toUpperCase();
    } else if (lowerCaseString[i - 1] == " ") {
      upperCaseString = upperCaseString + lowerCaseString[i].toUpperCase();
    } else {
      upperCaseString = upperCaseString + lowerCaseString[i];
    }
    i = i + 1;
  }
  console.log(upperCaseString);

  return upperCaseString;
}

titleCase("hello woRLD");

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.