我正在学习Javascript here。我现在的任务是取一个给定的字符串并将每个单词的开头大写,如果单词的其余部分已经是大写字母,则将其设置为小写。
到目前为止我所拥有的:
function titleCase(str){
var arrayify = str.split('');
arrayify.forEach(function(current, index){
for (var x = 0; x < current; x++){
var caps = current[x];
return caps;
}
});
}
我的测试字符串:
I'm a little tea pot
sHoRt AnD sToUt
HERE IS MY HANDLE HERE IS MY SPOUT
我尝试过的事情:
function titleCase(str){
str.split(' ').map(s => chartAt(0).toUpperCase() + s.slice(1)).join(' ');
}
function titleCase(str){
return this.replace(/\w\S*/g, function(txt){return txt.chartAt(0).toUpperCase} + txt.substr(1).toLowerCase();});
};
每次我使用=>
时,它都会告诉我需要esversion:6
才能运行它。
我的问题是,我做错了什么,以及最常用的做法是什么?
图片证明我并不疯狂:
答案 0 :(得分:1)
要详细说明现有解决方案的问题,它们几乎可以正常运行但存在以下问题:
function titleCase(str){
// missing `s.`--------v v---extra "t"
str.split(' ').map(s => chartAt(0).toUpperCase() + s.slice(1)).join(' ');
//^---missing return statement |---missing toLowerCase() call---^
}
function titleCase(str) {
// -----v--should be `str`
return this.replace(/\w\S*/g, function(txt){
// ------------v--extra "t" |----v--- extra "}"
return txt.chartAt(0).toUpperCase} + txt.substr(1).toLowerCase();
// ---missing `()` -------------^
});
};
以下是修正版本:
function titleCase(str){
return str.split(' ').map(s => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase()).join(' ');
}
function titleCase(str) {
return str.replace(/\w\S*/g, function(txt){
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});
}
答案 1 :(得分:1)
您可以更改函数,而不是在forEach
循环中返回,而是将结果附加到要在末尾返回的现有变量。
获取每个数组值开头的字符,将其更改为大写,然后将其添加到已转换为小写的值的其余部分。
示例强>:
function titleCase(str){
var arrayify = str.split(' ');
var result = '';
arrayify.forEach(function(item) {
result += item.charAt(0).toUpperCase() + item.slice(1).toLowerCase() + ' ';
});
return result.slice(0, -1); // remove last whitespace
}