#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 в качестве строки подстановки, это должно работать так, как задумано
вот скрипка для этого
Ответ №3:
Это заменяет первое вхождение символа в строке. Таким образом, символы на более ранних позициях также потенциально заменяются.
str1 = str1.replace(str1[i 1], str1[i 1].toUpperCase());