如何在Javascript中连接for循环中的字符串



我试图将每个单词的第一个字符大写,并将所有单词连接到一个字符串中。我已经设法将每个单词的第一个字符大写,但似乎无法使用.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')

通过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

您可以在循环中执行split[i] = split[i].charAt(0).toUpperCase() + split[i].substring(1),然后在循环外执行split.join('')

基本上,您将每个单词(split[i])替换为大写单词。最后把单词连起来。

finalResult是String,而不是Array,因此没有联接函数。

使用这个替代:

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()
}

您可以这样做:

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('') 
}

这是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')

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'))

您根本不需要使用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 finalResult;
}
console.log(generateHashtag('Hello my name is'));
  • 但是,通过使用带有mapreduce的函数式编程(FP)样式,可以大大简化此代码。请参见下文
  • 为了简洁起见,我还将您的代码更改为使用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语句具有parens,以防止不需要的自动分号插入,否则会破坏函数。

如果你想要类似于你的代码,但能工作,我会这样做:

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('');
}

function generateHashtag (str) {
return str.replace(/bS/g, e => e.toUpperCase()).replace(/s/g,'');
}
console.log(generateHashtag('Hello my name is'))

\b: bondary\S:非空格\S:空格。https://regex101.com/

//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'))

相关内容

  • 没有找到相关文章

最新更新