I'm new to JavaScript and am having a bit of trouble with this problem:
Construct a function called titleCase
that takes a sentence string and gives it title casing.
titleCase("this is an example") // Should return "This Is An Example"
titleCase("test") // Should return "Test"
titleCase("i r cool") // Should return "I R Cool"
titleCase("WHAT HAPPENS HERE") // Should return "What Happens Here"
titleCase("") // Should return ""
titleCase("A") // Should return "A"
This is the code I've tried:
const titleCase = function(text) {
text = text.split(' ');
for (let i = 0; i < text.length; i++) {
text[i] = text[i].toLowerCase().split('');
text[i][0] = text[i][0].toUpperCase();
text[i] = text[i].join('');
}
if (text === "") {
return ""
}
return text.join(' ');
}
It is passing all tests except for the empty string ""
test.
You will need to move:
if (text === "") {
return ""
}
to the first line of the function.
Here is a straightforward solution:
function titleCase(s){ let r=""; for (let i=0; i<s.length; i++) r+=(i==0 || s[i-1]==" ")?s[i].toUpperCase():s[i].toLowerCase(); return r; } console.log(titleCase("helLo tHERE!")); console.log(titleCase("this is an example")); //should return "This Is An Example" console.log(titleCase("test")); //should return "Test" console.log(titleCase("ir cool")); //should return "IR Cool" console.log(titleCase("WHAT HAPPENS HERE")); //should return "What Happens Here" console.log(titleCase("")); //should return "" console.log(titleCase("A")); //should return "A"
You just have to declare text empty as default in the function and add the if (text === "") {
condition before the for loop. So if the text is empty then before executing the for loop it will return "". Please check the following snippet:
const titleCase = function(text = '') { if (text === "") { return "" } text = text.split(' '); for (let i = 0; i < text.length; i++) { text[i] = text[i].toLowerCase().split(''); text[i][0] = text[i][0].toUpperCase(); text[i] = text[i].join(''); } return text.join(' '); } console.log(titleCase()); console.log(titleCase("Hello")); console.log(titleCase("Hello World"));
You can't modify a character with the []
notation.
To replace the first character of a string, don't do
str[0] = str[0].toUppercase()
but
str = "X" + str.substr(1)
Your function can be:
function titleCase(str) {
return str.toLowerCase().replace(/(^|\s)[a-z]/g, (a)=>a.toUpperCase());
}
This function will:
[az]
) following a space ( \s
) or the beginning of the string ( ^
) with its uppercase version.You can just use this simple function to solve this problem.
function titleCase(text) {
return text.split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ')
}
Now let's break it down a little bit.
First I'm using text.split(' ')
. It converts the sentence into an array of each word.
For example,
"this is an example"
became ['this', 'is', 'an', 'example']
Second, I'm using map()
to convert each word to be capitalized.
word.charAt(0).toUpperCase() + word.slice(1)
. This is a simple way to convert a word to be capitalized. It became:
['this', 'is', 'an', 'example']``` to ```['This', 'Is', 'An', 'Example']
And finally I'm just joining each word with a space:
join(' ')
Then it returns "This Is An Example"
.
this way (?)
const texts = ['this is an example', 'test', 'ir cool', 'WHAT HAPPENS HERE', '', 'A'] function titleCase(s) { let p = ' ', r = ''; for (let c of s.toLowerCase()) { r += (p === ' ') ? c.toUpperCase() : c p = c } return r } texts.forEach(txt => console.log(titleCase(txt)));
These console.log lines (after text = text.split(' ');
) should help you understand your mistake:
const titleCase = function(text) {
text = text.split(' ');
console.log(text)
console.log(text.length)
for (let i = 0; i < text.length; i++) {
text[i] = text[i].toLowerCase().split('');
text[i][0] = text[i][0].toUpperCase();
text[i] = text[i].join('');
}
if (text === "") {
return ""
}
return text.join(' ');
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.