В вашем примере кода есть две проблемы. Я пройду через них один за другим.
Строки неизменны
Это не работает так, как вы думаете, что делает:
finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase());
Вы должны изменить его на:
finalName = finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase());
В JavaScript, строки неизменный. Это означает, что после создания строки она не может быть изменена. Это может показаться странным, поскольку в вашем коде кажется, что вы меняете строку finalName
по всему циклу с помощью методов, таких как replace()
.
Но на самом деле вы на самом деле его не меняете! Функция replace()
принимает входную строку, выполняет ли замена, а создает новую строку вывода, так как на самом деле не разрешается изменять входную строку (неизменность). Итак, tl; dr, если вы не фиксируете вывод replace()
, назначив его переменной, замещенная строка будет потеряна.
Кстати, это нормально, чтобы вернуть его к исходному имени переменной, поэтому вы можете сделать finalName = finalName.replace(...)
.
Заменить жаден
Другая проблема, которую вы будете работать в, когда вы используете replace()
, вы будете заменять все символов соответствия в строке, а не только те, на позиции, которую вы изучаете. Это потому, что replace()
жадный - если вы скажете ему заменить «e» на «E», он заменит их все!
Что вам нужно сделать, по существу, является:
- Найти пробел (вы уже сделали это)
- захватить все строки до и включая пространство; эта «сторона» строки хороша.
- Преобразуйте самую следующую букву в верхний регистр, но только эту букву.
- Захват остальной части строки, письмо, которое вы преобразовали.
- Поместите все три части вместе (начало строки, заглавная буква, конец строки).
Метод slice()
будет делать то, что вы хотите:
if (finalName.charAt(i) === " ") {
// Get ONLY the letter after the space
var startLetter = finalName.slice(i+1, i+2);
// Concatenate the string up to the letter + the letter uppercased + the rest of the string
finalName = finalName.slice(0, i+1) + startLetter.toUpperCase() + finalName.slice(i+2);
}
Другим вариантом является регулярное выражение (регулярное выражение), в котором говорилось, что другие ответы. Вероятно, это лучший вариант, поскольку он намного чище. Но, если вы впервые изучаете программирование, легче понять эту ручную работу строк, написав исходные циклы. Позже вы можете использовать эффективный способ сделать это.
Рабочая jsfiddle: http://jsfiddle.net/9dLw1Lfx/
Дальнейшее чтение:
... Так? Вы должны хотя бы объяснить, почему это изменение необходимо, тем более, что этот вопрос кажется домашним заданием. – xdumaine
Я пробовал это, и он возвращает «AlbErt einstein». Не совсем уверен, почему он захватывает первое «е», а не одно за пространством? – JoshTheGray
@xdumaine Я согласен, я был в середине расширения объяснения, когда вы прокомментировали :) –