简体   繁体   中英

How do I solve this JavaScript titlecase problem with an empty string?

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:

  • convert all to lower case
  • then use a regular expression to replace letters ( [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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM