在数组上调用方法

时间:2011-04-25 03:27:43

标签: javascript

有人可以帮我理解这段代码中发生了什么吗?

   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变量以及如何使用它。谢谢你的帮助!

6 个答案:

答案 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()有效,因为init0Number),所以它们被视为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){
    
    1. s初始化为初始和值

      var s = init;
      
    2. 对于a中的每个元素:

      for (i = 0; i < a.length; i++)
      
    3. 总和是通过调用fn来计算,以计算最后计算的总和,s以及数组的当前元素a[i]

      s = fn( s, a[i] );
      
    4. 一旦将所有数组元素添加到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
*/