Próbuję napisać funkcję, która zamienia pierwszą literę każdego słowa w ciągu na wielką literę (konwertując ciąg na wielkość liter).
Na przykład, kiedy wejście jest "I'm a little tea pot"
, spodziewam "I'm A Little Tea Pot"
się, że będzie wyjściem. Jednak funkcja zwraca "i'm a little tea pot"
.
To jest mój kod:
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"));
javascript
string
title-case
slurrr
źródło
źródło
splitStr[i].charAt(0).toUpperCase();
to będzievoid
. MusiszsplitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].substring(1);
Odpowiedzi:
Nie przypisujesz ponownie zmian do tablicy, więc wszystkie twoje wysiłki są daremne. Spróbuj tego:
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"));
źródło
myStr.toLowerCase().split(' ').map(word => word.charAt(0).toUpperCase() + word.substring(1)).join(' ');
Sprawiasz, że złożoność jest bardzo łatwa. Możesz dodać to w swoim CSS:
W JavaScript możesz dodać klasę do elementu
document.getElementById("element").className = "capitalize";
źródło
Wersja 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);
źródło
toLowerCase()
na samym początku, na wypadek gdyby użytkownik lub ciąg znaków był mieszany.Myślę, że ta droga powinna być szybsza; ponieważ nie dzieli łańcucha i nie łączy go ponownie; po prostu używając wyrażenia regularnego.
var str = text.replace(/(^\w{1})|(\s{1}\w{1})/g, match => match.toUpperCase());
Wyjaśnienie :
(^\w{1})
: dopasowuje pierwszy znak ciągu|
: lub(\s{1}\w{1})
: dopasuj jeden znak, który pojawił się po jednej spacjig
: dopasuj wszystkoźródło
\s{1}
? Powiedziałbym\s+
, że działa nawet z kilkoma spacjami między słowamiJeśli możesz korzystać z biblioteki innej firmy, Lodash ma dla Ciebie funkcję pomocniczą.
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>
źródło
W ECMAScript 6, jednowierszowa odpowiedź przy użyciu funkcji strzałki:
const captialize = words => words.split(' ').map( w => w.substring(0,1).toUpperCase()+ w.substring(1)).join(' ')
źródło
w[0]
aby uczynić go jeszcze krótszym .. W przeciwieństwie do wyrażenia regularnego można go łatwo rozszerzyć o DOWOLNY symbol, ale nie tylkospace
. Przez dowolne mam na myśli(
[
"
, ponieważ litery również powinny być pisane wielką literą po tych symbolach. Więc dziękuję za twoje rozwiązanie!Shortest One Liner (również bardzo szybki):
text.replace(/(^\w|\s\w)/g, m => m.toUpperCase());
Wyjaśnienie:
^\w
: pierwszy znak ciągu|
: lub\s\w
: pierwszy znak po spacji(^\w|\s\w)
Uchwyć wzór.g
Flaga: dopasuj wszystkie wystąpienia.Jeśli chcesz się upewnić, że reszta jest zapisana małymi literami:
text.replace(/(^\w|\s\w)(\S*)/g, (_,m1,m2) => m1.toUpperCase()+m2.toLowerCase())
źródło
m => m.toUpperCase()
m
dopasowuje pierwszy znak, więc pierwsza litera jest wielka.Wersja ECMAScript 6 :
title .split(/ /g).map(word => `${word.substring(0,1).toUpperCase()}${word.substring(1)}`) .join(" ");
źródło
" "
zamiast""
, w przeciwnym razie otrzymasz jedno duże słowo, nie?𝗙𝗮𝘀𝘁𝗲𝘀𝘁 𝗦𝗼𝗹𝘂𝘁𝗶𝗼𝗻 𝗙𝗼𝗿 𝗟𝗮𝘁𝗶𝗻-𝗜 𝗖𝗵𝗮𝗿𝗮𝗰𝘁𝗲𝗿𝘀
Możesz po prostu użyć funkcji wyrażenia regularnego, aby zmienić wielkość każdej litery. Dzięki optymalizacjom V8 JIST powinno to być szybkie i wydajne pod względem pamięci.
// 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)})
Lub jako funkcja:
// 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); }
Według tego benchmarku kod jest o ponad 33% szybszy niż następne najlepsze rozwiązanie w Chrome.
𝗗𝗲𝗺𝗼
<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>
źródło
CSS to ma :)
źródło
Również dobra opcja (szczególnie jeśli używasz 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(" "); }
źródło
Ta procedura obsługuje wyrazy z łącznikami i słowa z apostrofem.
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";
źródło
function LetterCapitalize(str) { return str.split(" ").map(item=>item.substring(0,1).toUpperCase()+item.substring(1)).join(" ") }
źródło
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"));
Wersja do szybkiego odczytu, patrz test porównawczy http://jsben.ch/k3JVz
źródło
Składnia 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')
źródło
Możesz używać nowoczesnej składni JS, która może znacznie ułatwić Ci życie. Oto mój fragment kodu dla danego problemu:
const capitalizeString = string => string.split(' ').map(item => item.replace(item.charAt(0), item.charAt(0).toUpperCase())).join(' '); capitalizeString('Hi! i am aditya shrivastwa')
źródło
Zwykle wolę nie używać wyrażeń regularnych ze względu na czytelność, a także staram się trzymać z daleka od pętli. Myślę, że to jest czytelne.
function capitalizeFirstLetter(string) { return string && string.charAt(0).toUpperCase() + string.substring(1); };
źródło
Poniższa funkcja nie zmienia żadnej innej części ciągu niż próba konwersjiwszystkich pierwszych liter wszystkich słów (tj. Zgodnie z definicją wyrażenia regularnego
\w+
) na wielkie litery.Oznacza to, że to jednak nie koniecznie konwersji słów Titlecase, ale robi dokładnie to, co tytuł pytanie mówi: „wielką literą każdego wyrazu w ciągu znaków - JavaScript”
\w+
które jest równoważne[A-Za-z0-9_]+
String.prototype.toUpperCase()
tylko do pierwszego znaku każdego słowa.function first_char_to_uppercase(argument) { return argument.replace(/\w+/g, function(word) { return word.charAt(0).toUpperCase() + word.slice(1); }); }
Przykłady:
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"
Edytuj 2019-02-07: Jeśli chcesz rzeczywistą literę tytułu (tj. Tylko pierwsza wielka litera, wszystkie pozostałe małe):
function titlecase_all_words(argument) { return argument.replace(/\w+/g, function(word) { return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); }); }
Przykłady pokazujące oba:
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
źródło
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(' '); }
źródło
Lub można to zrobić za pomocą funkcji replace () i zastępując pierwszą literę każdego słowa jego „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");
źródło
Oto, jak możesz to zrobić za pomocą
map
funkcji w zasadzie, robi to samo, co zaakceptowana odpowiedź, ale bezfor-loop
. W związku z tym oszczędza kilka wierszy kodu.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"));
źródło
Poniżej znajduje się inny sposób zapisania wielkimi literami pierwszego alfabetu każdego słowa w ciągu.
Utwórz niestandardową metodę dla obiektu String przy użyciu
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());
źródło
Bardziej kompaktowe (i nowoczesne) przepisanie @ czegoś proponuje rozwiązanie:
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"));
źródło
Surowy kod:
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');
źródło
Użyłem
replace()
z wyrażeniem regularnym: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")
źródło
Tutaj znajduje się kompletne i proste rozwiązanie:
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));
źródło
let str = "I'm a little tea pot"; str = str.toLowerCase();
i dodaj właściwość css
text-transform: capitalize;
do odpowiedniego elementu.źródło
Sprawdź poniższy kod.
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);
źródło
Od ECMA2017 lub 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);
Wyjaśnienie:
1. Najpierw przekazujemy ciąg znaków „test test test” do naszej funkcji „titleCase”.
2. Podzieliliśmy łańcuch na podstawie spacji, więc wynikiem pierwszej funkcji "split" będzie ["test", "test", "test"]
3. Gdy otrzymaliśmy tablicę, użyliśmy funkcji map do manipulowania każdym słowem w tablicy. Kapitalizujemy pierwszy znak i dodajemy do niego pozostały znak.
4. W ostatnim przypadku łączymy tablicę przy użyciu spacji, dzieląc ciąg przez sapce.
źródło
toLowerCase()
.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");
źródło