归约函数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]