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

时间:2016-07-31 19:45:49

标签: javascript function reduce

我无法将我的解决方案重新分解为" Jaden Casing Strings"关于代码战的kata。问题是要将给定句子的每个单词的第一个字母大写,如下所示:

不是Jaden-Cased:"如果我们的眼睛不真实,那么镜子怎么能成真呢?

Jaden-Cased:"如果我们的眼睛非常真实"

,那镜子怎么能成真呢?

这是我的解决方案:

$sql

理想情况下,我希望在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

5 个答案:

答案 0 :(得分:1)

以下是一种更简单的方法:



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 + next,如果str没有以空格结束(即str[index-1],这是最后一个char,则是空格)。如果str以空格结尾,则next是新字符串的第一个字母。然后它大写了。因此,在这种情况下,我们会返回str+next.toUpperCase()

答案 1 :(得分:1)

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

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

将可用。

答案 2 :(得分:0)

这很简单:

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

如果您仍想从String原型中隔离toJadenCase的逻辑,可以在方法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;
} 

然后在String原型中定义toJadenCase为......

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

检查此JS Bin example.

的控制台