2011-04-25 19 views
0

有人可以帮助我理解此代码中发生了什么吗?数组上的调用方法

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

+1

你应该在'for'循环中的'i = 0'之前添加'var';否则,'reduce'将不会递归地工作。 – icktoofay 2011-04-25 03:49:53

回答

0

它正在调用数组中每个元素的函数,传递init(每次迭代时都会更新)和当前数组成员。

然后它返回s值,该值是通过传递的函数传递的值的返回值。

sum()作品,因为init0Number),所以它们被视为Number秒。

join()的工作原理是因为它传递了一个空的String""),所以它们被视为String s。

0

功能reduce()是聚合器功能,传递的数组a的每一个元素上执行的传递函数fn和与它一起使状态(最初具有的init的值),代表先前呼叫的结果。

sum()的情况下,即它通过将所有先前元素的总和(s)传递给下一个函数调用来总和数组的所有元素,因此“聚合”是所有元素的总和。

0

b是传递给匿名函数(fn)的参数。该函数简单地组合两个值并返回结果。 reduce函数重复调用fn以将该数组组合为单个值。请注意0​​的a参数与匿名函数的参数a不相同。

编辑:您请求的例子:

var myArray = [1, 2, 3, 4, 5]; 
var mySum = sum(myArray); 

注意sum使用reduce

+0

如何在数组上调用这个reduce方法,如果它已经被声明了,哪些不是这样,它将所有元素加起来并显示结果? – Spence 2011-04-25 03:37:59

+0

@Spence,我发表了一个例子。 – 2011-04-25 03:42:01

0

@Marcelo's answer可能是这段代码最好也是最一般的解释 - 那就是你要找的那个。


A.当通过sum调用时,函数reduce得3个参数

  • fn求和两个数字
  • a功能,数字的阵列,以进行求和
  • b,初始总和(设置为0

    function reduce(fn, a, init){ 
    
    1. s被初始化为INTIAL总和值

      var s = init; 
      
    2. 对于每个元素在a

      for (i = 0; i < a.length; i++) 
      
    3. 总和是通过调用fn添加计算,s最后总和,和当前元素计算的阵列a[i]

      s = fn(s, a[i]); 
      
    4. A第二返回一次该和所有数组元素已被添加到s

      return s; 
      } 
      

B.当通过join调用时,函数reduce得3个参数

  • fn的函数连接两个字符串
  • a,要连接的值的数组
  • b,初始字符串(空字符串""

它确实几乎与上述相同,除了它返回一个字符串这是阵列中的所有值的串联的相同。

2

reduce函数需要一些操作者,•,这是由fn实现,并计算施加•到所有元素反过来的结果:

reduce(•, [a, b, c, d, e], init) = init • a • b • c • d • e 

在总和的情况下,操作者通过实现fn+,所以你最终得到init + a + b + c + d + e。同样对于连接(除了字符串,+连接)。

+0

谢谢你的帮助! – Spence 2011-04-25 03:50:32

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 
*/