使用 reduce() 定义新的字符串方法
Using reduce() in defining new string methods
我在重构 "Jaden Casing Strings" codewars 套路的解决方案时遇到问题。问题是将给定句子的每个单词的首字母大写,如下所示:
不是 Jaden-Cased:"How can mirrors be real if our eyes aren't real"
Jaden-Cased: "How Can Mirrors Be Real If Our Eyes Aren't Real"
这是我的解决方案:
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)
}
理想情况下,我希望在 String.prototype.toJadenCase = function () {
中包含 jayden
函数的内容,但我似乎无法遍历 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,
逻辑是:return str+next,如果str不以space结尾(即str[index-1]
,也就是最后一个字符,是space).如果 str
以 space 结尾,则 next
是新字符串的第一个字母。然后是大写。所以,在这种情况下,我们 returning str+next.toUpperCase()
这很简单:
var str = "How can mirrors be real if our eyes aren't real";
var jayden = str.split(" ").map(x => x[0].toUpperCase().concat(x.slice(1))).join(" ");
console.log(jayden); // How Can Mirrors Be Real If Our Eyes Aren't Real
与您的问题类似,return 立即调用匿名函数而不是调用命名函数:
String.prototype.toJadenCase = function () {
return function (sen) {
return sen.split('').reduce(function (str, next, ind) {
return str + (!sen[ind - 1] || sen[ind - 1] === ' ' ? next.toUpperCase() : next);
}, '');
}(this);
};
console.log("How can mirrors be real if our eyes aren't real".toJadenCase());
如果您仍想从字符串原型中分离出 toJadenCase
的逻辑,您可以将方法 toJadenCase
引用为 this
,然后将 this
值从内部字符串原型。喜欢...
function jayden () {
var self = this;
self = self.split('').reduce(function (str, next, ind) {
return str + (!self[ind - 1] || self[ind - 1] === ' ' ? next.toUpperCase() : next);
}, '');
return self;
}
然后将String原型中的toJadenCase定义为...
String.prototype.toJadenCase = function () {
return jayden.call(this);
};
检查这个JS Bin example.
的控制台
我不明白为什么有些人试图编写会导致全球变暖的代码。
String.prototype.toJadenCase = function(s) {
s=s||this;
var a = s.split(" "), i=0;
while(a[i])a[i]=a[i].replace(a[i][0],a[i++][0].toUpperCase());
return a.join(" ");
}
可以两种方式使用,例如字符串:
var str = "How can mirrors be real if our eyes aren't real"
你可以去:
str.toJadenCase();
但不限于,如果需要和需要时的替代方案
"".toJadenCase(str);
将可用。
我在重构 "Jaden Casing Strings" codewars 套路的解决方案时遇到问题。问题是将给定句子的每个单词的首字母大写,如下所示:
不是 Jaden-Cased:"How can mirrors be real if our eyes aren't real"
Jaden-Cased: "How Can Mirrors Be Real If Our Eyes Aren't Real"
这是我的解决方案:
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)
}
理想情况下,我希望在 String.prototype.toJadenCase = function () {
中包含 jayden
函数的内容,但我似乎无法遍历 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,
逻辑是:return str+next,如果str不以space结尾(即str[index-1]
,也就是最后一个字符,是space).如果 str
以 space 结尾,则 next
是新字符串的第一个字母。然后是大写。所以,在这种情况下,我们 returning str+next.toUpperCase()
这很简单:
var str = "How can mirrors be real if our eyes aren't real";
var jayden = str.split(" ").map(x => x[0].toUpperCase().concat(x.slice(1))).join(" ");
console.log(jayden); // How Can Mirrors Be Real If Our Eyes Aren't Real
与您的问题类似,return 立即调用匿名函数而不是调用命名函数:
String.prototype.toJadenCase = function () {
return function (sen) {
return sen.split('').reduce(function (str, next, ind) {
return str + (!sen[ind - 1] || sen[ind - 1] === ' ' ? next.toUpperCase() : next);
}, '');
}(this);
};
console.log("How can mirrors be real if our eyes aren't real".toJadenCase());
如果您仍想从字符串原型中分离出 toJadenCase
的逻辑,您可以将方法 toJadenCase
引用为 this
,然后将 this
值从内部字符串原型。喜欢...
function jayden () {
var self = this;
self = self.split('').reduce(function (str, next, ind) {
return str + (!self[ind - 1] || self[ind - 1] === ' ' ? next.toUpperCase() : next);
}, '');
return self;
}
然后将String原型中的toJadenCase定义为...
String.prototype.toJadenCase = function () {
return jayden.call(this);
};
检查这个JS Bin example.
的控制台我不明白为什么有些人试图编写会导致全球变暖的代码。
String.prototype.toJadenCase = function(s) {
s=s||this;
var a = s.split(" "), i=0;
while(a[i])a[i]=a[i].replace(a[i][0],a[i++][0].toUpperCase());
return a.join(" ");
}
可以两种方式使用,例如字符串:
var str = "How can mirrors be real if our eyes aren't real"
你可以去:
str.toJadenCase();
但不限于,如果需要和需要时的替代方案
"".toJadenCase(str);
将可用。