我试图将每个单词的第一个字符大写,并将所有单词连接到一个字符串中。我已经设法将每个单词的第一个字符大写,但似乎无法使用.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'));
- 但是,通过使用带有
map
和reduce
的函数式编程(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'))