在定义新的字符串方法时使用reduce()

Using reduce() in defining new string methods

本文关键字:reduce 方法 定义 字符串      更新时间:2023-09-26

我在重新分解codewars上的"Jaden Casing Strings"kata的解决方案时遇到了问题。问题是将给定句子中每个单词的第一个字母大写,如下所示:

不是Jaden Cased:"如果我们的眼睛不是真的,镜子怎么可能是真的"

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

理想情况下,我希望在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。以下是分解,strnext如何随每次迭代而变化。逗号前面是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()

我不明白为什么有些人试图编写会导致全球变暖的代码。

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

将提供。

这很简单:

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

类似于您的问题,返回一个立即调用的匿名函数,而不是调用一个命名函数:

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的逻辑与String原型隔离开来,您可以在方法toJadenCase上引用this,然后从String原型内部更改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;
} 

然后将字符串原型中的toJadenCase定义为…

String.prototype.toJadenCase = function () {
    return jayden.call(this);
};

检查这个JS Bin示例的控制台。