我对如何在字符串上执行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());
答案 0 :(得分:3)
第一次调用回调first
是一个字符串(数组中的第一个元素),当first
和last
都是字符串时,你的函数是有意义的,所以它当回调只被调用一次时(数组最多有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
命名并按照其调用方式
foo(0, "i am a boy")
提供NaN
foo(NaN, " she loves cats")
提供NaN
foo(NaN, " a goat ate my flower garden ")
提供NaN
给出NaN
的最终结果。
这是因为number.length
未定义且Math.max(undefined, x)
为NaN
看起来你想编写一个只接受第二个arg的长度的函数
function foo(a, b) {
return Math.max(a, b.length);
}
在这种情况下,您将获得
foo(0, "i am a boy")
提供10
foo(10, " she loves cats")
提供15
foo(15, " a goat ate my flower garden ")
提供29
给出29
的最终结果。