Использование заглавной первой буквы каждого слова работает не так, как ожидалось

#javascript

#javascript

Вопрос:

Прежде всего, я знаю, что это неправильный способ сделать это, но я хочу понять, почему это происходит, чтобы я лучше понимал язык.

 function titleCase(str) {
  let str1 = str.toLowerCase();
  str1 = str1.replace(str1[0], str1[0].toUpperCase());
  console.log(str1);

  for(let i=1; i < str1.length; i  ){
    if(str1[i]===' '){
      str1 = str1.replace(str1[i 1], str1[i 1].toUpperCase());
      console.log(i);
      console.log(str1);
    }
  }
  return str1;
}

titleCase("ab cd ef gh ba");
  

Итак, если первая буква последнего слова не отображается как предпоследняя буква ни в одном слове, прежде чем оно заработает, «ab cd ef gh» здесь проблем нет, но «ab cd ef gh ba» приводит к следующему выводу: «AB Cd Ef Gh ba» и т.д..
Спасибо!

Комментарии:

1. Логика вашей функции неверна. Вам нужно пересмотреть это.

2. Для справки, эта функция была бы намного лучше, поскольку: titleCase = str => str.replace(/b[a-z]/, x=>x.toUpperCase());

3. Я бы сказал, replace не делает того, что вы думаете. Он не принимает индекс, он принимает строковое значение (или одиночный символ) и заменяет его первое вхождение .

4. Я предполагаю, что это то, на что вы намекали, когда упомянули, что знаете, что это неправильный способ сделать это, но на всякий случай, что это не так: у python есть простой способ сделать это: docs.python.org/3/library/stdtypes.html#str.title

Ответ №1:

Причина, по которой это происходит, заключается в том, что .replace() функция заменит первое вхождение.

 "Tell us more about your question us"
  

При первом обнаружении пробела он заменит первое вхождение строчной буквы «u», которая оказывается правильной:

 "Tell us more about your question us"
//    ^ this "u" happens to be the first occurrence
  

Но когда дело доходит до последнего слова «us», он снова попытается найти первое вхождение строчной буквы «u», которая находится в середине слова «about»:

 "Tell Us More About Your Question us"
//               ^ this "u" is now the first lowercase "u"
  

Ответ №2:

для замен sring такого рода id лучше использовать регулярное выражение

используя / b(.) /g в качестве шаблона для первой буквы и U $ 0 в качестве строки подстановки, это должно работать так, как задумано

вот скрипка для этого

https://regex101.com/r/qQ2dE4/423

Ответ №3:

Это заменяет первое вхождение символа в строке. Таким образом, символы на более ранних позициях также потенциально заменяются.

 str1 = str1.replace(str1[i 1], str1[i 1].toUpperCase());