我在重构代码战中“ Jaden Casing Strings” kata的解决方案时遇到了麻烦。问题是将给定句子的每个单词的首字母大写,如下所示:
没有贾登·卡斯德:“如果我们的眼睛不真实,镜子怎么会真实”
Jaden-Cased:“如果我们的眼睛不真实,那么镜子怎么会真实”
这是我的解决方案:
function jayden (sen) {
sen = sen.split('').reduce(function (str, next, ind) {
return str + (!sen[ind - 1] || sen[ind - 1] === ' ' ? next.toUpperCase() : next);
}, '');
return sen
}
String.prototype.toJadenCase = function () {
return jayden(this)
}
理想情况下,我希望将
jayden
函数的内容包含在String.prototype.toJadenCase = function () {
内,但是我似乎无法遍历this
。是否可以通过this
进行迭代? 最佳答案
您可以通过以下更简单的方法进行操作:
String.prototype.toJadenCase = function () {
return this.split(" ").map(function(x){
return x[0].toUpperCase()+x.slice(1);
}).join(" ");
}
console.log("How can mirrors be real if our eyes aren't real".toJadenCase())
使用
reduce()
的另一个示例:String.prototype.toJadenCase = function () {
return this.split('').reduce(function (str, next, index) {
return str+(str[index-1]==" "?next.toUpperCase():next)
});
}
console.log("How can mirrors be real if our eyes aren't real".toJadenCase())
第二个示例如何工作:
每次
str
是字符串的当前部分而没有最后一个字符。最后一个字符是next
。这是细目,str
和next
每次迭代如何变化。逗号之前是str
,之后是next
。 H,o
Ho,w
How,
How ,c
How C,a
How Ca,n
How Can,
How Can ,m
How Can M,i
How Can Mi,r
How Can Mir,r
How Can Mirr,o
How Can Mirro,r
How Can Mirror,s
How Can Mirrors,
How Can Mirrors ,b
How Can Mirrors B,e
How Can Mirrors Be,
逻辑是:如果str不以空格结尾(即
str[index-1]
,这是最后一个字符,是一个空格),则返回str + next。如果str
以空格结尾,则next
是新字符串的第一个字母。然后将其大写。因此,在这种情况下,我们返回str+next.toUpperCase()