在string上实现array.prototype.reduce()

时间:2014-09-17 03:25:44

标签: javascript arrays reduce

我对如何在字符串上执行reduce操作感到困惑。首先创建一个新的Str实例并将所需的字符串作为参数发送。

然后使用split方法将其拆分为string数组.exlowIt方法获取数组并执行reduce操作,该操作返回具有高度长度的数组元素。

使用两个元素数组可以正常工作。但是如果有两个以上的元素则返回NAN。

为什么它为具有两个以上元素的数组返回NAN?

function Str(text){
   this.text=text.split('\n');
}
Str.prototype.reduceIt = function() {
  return this.text.reduce(function(first,last,index,arr) {
          return Math.max(first.length,last.length);

  });
};

var t=new Str('i am a boy\n she loves cats\n a goat ate my flower garden ');
console.log(t.reduceIt());

3 个答案:

答案 0 :(得分:3)

第一次调用回调first是一个字符串(数组中的第一个元素),当firstlast都是字符串时,你的函数是有意义的,所以它当回调只被调用一次时(数组最多有2个元素)。

第二次调用它是前一次调用的结果,number。当您拨打某个号码first.length时会收到undefined,当您拨打Math.max时,会收到NaN

如果要查找数组中最长字符串的长度,可以使用:

Math.max.apply(Math, this.text.map(function (str) { return str.length; }));

答案 1 :(得分:2)

已有一些好的答案。 : - )

解决问题的简单方法是提供初始值0,然后将返回值与新字符串的长度进行比较,这样:

Str.prototype.reduceIt = function() {
  return this.text.reduce(function(first,last,index,arr) {

          // Compare current value (first) with length of string
          return Math.max(first,last.length);

  }, 0); // supply 0 as the initial value
};

首先重命名为 maxSoFar 并将最后重命名为 currentString 可能会更清楚。

答案 2 :(得分:1)

  

为什么它为具有两个以上元素的数组返回NAN?

由于number.length 未定义,请让我们为您的函数foo命名并按照其调用方式

  1. foo(0, "i am a boy")提供NaN
  2. foo(NaN, " she loves cats")提供NaN
  3. foo(NaN, " a goat ate my flower garden ")提供NaN
  4. 给出NaN的最终结果。

    这是因为number.length 未定义Math.max(undefined, x)NaN

    看起来你想编写一个只接受第二个arg的长度的函数

    function foo(a, b) {
        return Math.max(a, b.length);
    }
    

    在这种情况下,您将获得

    1. foo(0, "i am a boy")提供10
    2. foo(10, " she loves cats")提供15
    3. foo(15, " a goat ate my flower garden ")提供29
    4. 给出29的最终结果。