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

时间:2024-12-16 16:33:56
function forEach(array,action){
for(var i=;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===?:);
}
return reduce(counter,,array);
}
console.log(countZeroes([,,,,])) 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]