#javascript
Вопрос:
Я пытаюсь прописать первый символ каждого слова и объединить все слова в одну строку. Мне удалось прописать первый символ каждого слова, но, похоже, я не могу получить .join() для работы над конечным результатом
function generateHashtag (str) {
let split = str.split(' ')
for(let i = 0; i < split.length; i ){
let finalResult = split[i].charAt(0).toUpperCase() split[i].substring(1)
console.log(finalResult.join(''))
}
}
console.log(generateHashtag('Hello my name is')) should return ('HelloMyNameIs')
Комментарии:
1.
finalResult
является aString
, а не anArray
, поэтомуjoin
функции нет.2. Подсказка: если вы используете TypeScript, вы избежите подобных проблем с безопасностью ввода.
3. вы можете сделать это
split[i] = finalResult
в цикле, а затем вне циклаsplit.join('')
Ответ №1:
Достижение этого путем split
возможно. сначала создайте массив разделенных строк (разделителем»), а затем обведите массив и заглавными буквами первый символ, используя метод toUpperCase
, и соедините остальную часть строки без первой буквы, используя slice
function generateHashtag(str) {
let split = str.split(' ');
for (let i = 0; i < split.length; i ) {
split[i] = split[i].charAt(0).toUpperCase() split[i].slice(1);
}
return split.join('');
}
console.log(generateHashtag('Hello my name is'));
Подробнее о split
… https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split
Комментарии:
1. Итак, вы присоединились к «расколу» за пределами цикла for? Почему это не сработало внутри цикла for в первую очередь?
2. @mmiah Ты ведь точно знаешь, что
join()
делает, верно? Мне любопытно услышать, что, по вашему мнению, он делает и почему вы думаете, что вызовjoin()
внутри тела цикла приведет к значимому результату.3. @mmiah, вы хотите присоединиться к массиву строк после завершения цикла, чтобы вернуть отформатированную строку.
Ответ №2:
вы можете сделать это split[i] = split[i].charAt(0).toUpperCase() split[i].substring(1)
в цикле, а затем вне цикла split.join('')
По сути, вы заменяете каждое слово ( split[i]
) заглавным словом. Затем в конце соедините слова.
Ответ №3:
finalResult-это строка, а не массив, поэтому функции объединения нет.
Используйте это вместо :
function generateHashtag (str) {
let arrayWords = str.split(' ')
const titleCasedArray = arrayWords.map(word => titleCaseWord(word))
return titleCasedArray.join('');
}
function titleCaseWord (word){
return word.slice(0,1).toUpperCase() word.slice(1,-1).toLowerCase()
}
Ответ №4:
Вы можете сделать что-то вроде этого:
function generateHashtag (str) {
//returns array of strings
let split = str.split(' ')
//returns array of strings with each word capitalized
const capitalizedWordsArr = split.map( word => word.charAt(0).toUpperCase() word.substring(1))
//returns a string by joining above array with no spaces
return capitalizedWordsArr.join('')
}
Комментарии:
1. Ваш
let split
может бытьconst split
кстати.
Ответ №5:
Это идеальный вариант использования для Array.prototype.reduce
:
function generateHashtag(str) {
return str
.split(' ')
.reduce((acc, [firstLetter, ...rest]) => acc = `${firstLetter.toUpperCase()}${rest.join('')}`,
''
);
}
console.log(generateHashtag('Hello my name is')); // should return ('HelloMyNameIs')
Ответ №6:
Строки Javascript неизменяемы, поэтому вы не можете перезаписать их на ходу, но вы можете перезаписать элементы массива.
С помощью String.prototype.substr()
вы можете извлечь часть строки, вы можете использовать эти части, изменить ее и создать новую строку, а затем заменить старый элемент массива. наконец, возвращаем объединенную строку, как вы хотели
function generateHashtag(str) {
const split = str.split(' ') // array of words
for (let i = 0; i < split.length; i )
split[i] = split[i].substr(0, 1).toUpperCase() split[i].substr(1); // overwriting existing elements with Titlecased words
return split.join(''); // returning final string
}
console.log(generateHashtag('Hello my name is'))
Ответ №7:
Вам вообще не нужно использовать join
, просто объявите и инициализируйте finalResult
вне цикла и объедините каждое слово внутри цикла:
function generateHashtag(str) {
const split = str.split(' '); // Array<String>
let finalResult = ''; // String
for(let i = 0; i < split.length; i ) {
const titleCased = split[i].charAt(0).toUpperCase() split[i].substring(1);
finalResult = titleCased;
}
return finalResu<
}
console.log(generateHashtag('Hello my name is'));
- Однако вы можете значительно упростить этот код, используя стиль функционального программирования (FP) с
map
иreduce
. Смотреть ниже. - Я также изменил ваш код для использования
toLocaleUpperCase
вместоtoUpperCase
и использует[0]
для краткости. - Его по-прежнему безопасно использовать
substring(1)
для односимвольных строк, он просто возвращается''
.
function generateHashtag(str) {
return ( str
.split(' ')
.map( word => word[0].toLocaleUpperCase() word.substring(1).toLocaleLowerCase() )
.reduce( ( word, concat ) => concat word, "" )
);
}
- Я забыл, что
join()
это все еще можно использовать вместоreduce
(и в любом случае будет иметь оптимизированную реализацию внутри движка JS): - Я также переместил
map
логику функции в именованную функциюtoTitleCase
.
function generateHashtag(str) {
const toTitleCase( word ) => word[0].toLocaleUpperCase() word.substring(1).toLocaleLowerCase();
return ( str
.split(' ')
.map( word => toTitleCase( word ) ) // or just `.map( toTitleCase )`
.join()
);
}
В return
инструкции есть скобки для предотвращения нежелательной автоматической вставки точки с запятой, которая в противном случае нарушила бы функцию.
Ответ №8:
Если вы хотите что-то похожее на свой код, но работающее, я бы сделал это:
function generateHashtag (str) {
let split = str.split(' ')
let newStr = []
for (let i = 0; i < split.length; i ){
newStr.push(split[i].charAt(0).toUpperCase() split[i].substring(1))
}
return newStr.join('')
}
Вы также можете выполнить эту задачу с помощью «регулярного выражения».
https://cheatography.com/davechild/cheat-sheets/regular-expressions/
Вот быстрая реализация:
const generateHashtag = str => {
// regular expression to capitalize the words
const regEx = /(b[a-z](?!s))/g
str = str.replace(regEx, (char) => {
return char.toUpperCase()
});
// remove spaces, return
return str.split(' ').join('')
}
Тот же код, но с меньшей удобочитаемостью:
const generateHashtag = str => {
return str.replace(/(b[a-z](?!s))/g, (char) => {
return char.toUpperCase()
}).split(' ').join('');
}
Ответ №9:
function generateHashtag (str) {
return str.replace(/bS/g, e => e.toUpperCase()).replace(/s/g,'');
}
console.log(generateHashtag('Hello my name is'))
b: бондарь S: не пространство s: пространство.
https://regex101.com/
Ответ №10:
//try this code solve your problem
const generateHashtag = str => {
let split = str.split(' ')
let finalResult = []
for (word of split) {
finalResult.push(word[0].toUpperCase() word.substring(1))
}
return finalResult.join('')
}
console.log(generateHashtag('Hello my name is'))