Как соединить строки в цикле for в Javascript?

#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 является a String , а не an Array , поэтому 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'))