有人可以帮我理解这段代码中发生了什么吗?
function reduce(fn, a, init){
var s = init;
for (i = 0; i < a.length; i++)
s = fn( s, a[i] );
return s;
}
function sum(a)
{
return reduce( function(a, b){ return a + b; },
a, 0 );
}
function join(a)
{
return reduce( function(a, b){ return a + b; },
a, "" );
}
我猜我扔的部分是b变量以及如何使用它。谢谢你的帮助!
答案 0 :(得分:2)
reduce函数需要一些运算符,由fn
实现,并计算依次对所有元素应用的结果:
reduce(•, [a, b, c, d, e], init) = init • a • b • c • d • e
在总和的情况下,由fn
实施的运算符为+
,因此您最终得到init + a + b + c + d + e
。同样地,对于连接(除了字符串,+
连接)。
答案 1 :(得分:0)
它在数组中的每个元素上调用函数,传递init(在每次迭代时更新)和当前数组成员。
然后返回s
值,该值是通过传递的函数传递的值的返回值。
sum()
有效,因为init
为0
(Number
),所以它们被视为Number
。
join()
有效,因为它传递了空的String
(""
),因此它们被视为String
s。
答案 2 :(得分:0)
函数reduce()
是一个聚合函数,在传递的数组fn
的每个元素上执行传递的函数a
并传递一个状态(最初的值为{{1}与它一起表示前一次调用的结果。
在init
的情况下,即它通过将所有先前元素(sum()
)的总和传递给下一个函数调用来汇总数组的所有元素,因此“aggregate”是所有元素。
答案 3 :(得分:0)
b
是传递给reduce的匿名函数(fn
)的参数。该函数只是组合两个值并返回结果。 reduce
函数重复调用fn
以将数组合并为单个值。请注意,a
的{{1}}参数与匿名函数的reduce
参数不同。
编辑:您请求的示例:
a
请注意,var myArray = [1, 2, 3, 4, 5];
var mySum = sum(myArray);
使用sum
。
答案 4 :(得分:0)
@Marcelo's answer可能是这段代码的最佳和最一般的解释 - 这是你正在寻找的那个。
一个。通过sum
调用时,函数reduce
获得3个参数
fn
将两个数字相加的函数a
,要汇总的数字数组 b
,初始金额(设为0
)
function reduce(fn, a, init){
s
初始化为初始和值
var s = init;
对于a
中的每个元素:
for (i = 0; i < a.length; i++)
总和是通过调用fn
来计算,以计算最后计算的总和,s
以及数组的当前元素a[i]
s = fn( s, a[i] );
一旦将所有数组元素添加到s
return s;
}
B中。通过join
调用时,函数reduce
获得3个参数
fn
连接两个字符串的函数a
,要连接的值数组b
,初始字符串(空字符串""
)它与上面解释的几乎相同,只是它返回一个字符串,它是数组中所有值的串联。
答案 5 :(得分:0)
// All new browsers implement a native reduce method for arrays-
// it might be better to shim older browsers to use the same method,
// so that you can use the native method where available.
if(!Array.prototype.reduce){
Array.prototype.reduce= function(fun, temp, scope){
var i= 0, T= this, len= T.length, temp;
if(scope== undefined) scope= window;
if(typeof fun=== 'function'){
if(temp== undefined) temp= T[i++];
while(i < len){
if(i in T) temp= fun.call(scope, temp, T[i], i, T);
i++;
}
}
return temp;
}
Array.prototype.reduceRight= function(fun, temp, scope){
var T= this.concat().reverse();
return T.reduce(fun, temp, scope);
}
}
var A=[1,2,3,4,5,6,7,8,9,10];
/* A.reduce(function(a,b){return a+b});
value: (Number)55
A.reduce(function(a,b){return a*b});
value: (Number)3628800
*/