归约函数reduce&映射数组map(笔记)

function forEach(array,action){
  for(var i=0;i<array.length;i++)
    action(array[i]);
}
function reduce(combine,base,array){
  forEach(array,function(element){
  base=combine(base,element);})
  return base;
}

function countZeroes(array){
  function counter(total,element){
    return total+(element===0?1:0);
  }
  return reduce(counter,0,array);
}
console.log(countZeroes([0,23,56,0,0]))

3

【归约函数】

以上三个函数,第一个forEach()实现的是遍历数组,并对其中的每一个元素进行anction()的操作。

第二个 reduce()即归约函数(reduce or fold)通过重复调用一个函数//(该函数将数组的每个元素都加到一个基值上),将数组转化为单一值。

归约函数的三个参数分别是——待执行函数,基数,数组(这样的顺序主要基于习惯问题)。

第三个  函数即计算数组中0元素的个数,解决这个问题即重复比较数组的元素是否为0.故而可以选择归约函数。对应的三个参数分别——counter()函数,0,array。

其中,counter用到条件运算符,值等于0,则基数加一。

 

另,可以另外定义一个算法函数count,供countZeros使用。

function forEach(array,action){
  for(var i=0;i<array.length;i++)
    action(array[i]);
}
function count(test,array){
    var counted=0;
  forEach(array,function(element){
      if(test(element)) counted++;
  })
return counted; }
function countZeroes(array){ function isZero(x){return x===0;}//整个函数作为返回值,传递作为if的判断条件。因为函数本身是比较参数是否为0,返回值即true/false. return count(isZero,array); }
console.log(countZeroes([0,23,56,0,0]))

3


 

映射数组

所谓映射,是指他可以遍历数组,并且将函数应用于每个元素(比如forEach)。但是他不是丢弃函数返回值,而是利用这些返回值重新建立一个新的数组。

函数count(),用以测试数组中的元素是否符合test的条件,符合则统计数字加一。

函数countZeros(),接受一个参数、即测试的数组。并在其中定义测试的方法test=isZero【因为该方法只对countZeros()函数有意义,所以定义在该函数体内。而其他的像是count()这类,其参数具有更加抽象的普遍意义,故而单独定义。以供反复使用】

function map(func,array){
    var result=[];
  forEach(array,function(element){
  result.push(func(element));
  }
  )
  return result;
}
console.log(map(Math.round,[0.09,2,3.4,9.4,Math.PI]));
[0, 2, 3, 9, 3]

 

posted @ 2015-06-25 21:21  Sinister  阅读(1182)  评论(0编辑  收藏  举报

This is my world!