需求:取出所有小于100的数字
函数式编程:命令式编程/声明式编程
编程范式:面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)
下面是普通写法
const nums = [10, 20, 30, 40, 554];
let newNums = [];
for (let n of nums) {
if (n < 100) {
newNums.push[n];
}
}
//2.将所有小于100的数字进行转化:全部*2
let new2Nums = [];
for (let n of newNums) {
new2Nums.push(n * 2);
}
console.log(new2Nums);
// 3..将所有的数字相加,得到最终的结果
let total=0;
for(let n of new2Nums){
total+=n;
}
console.log(total)
接下来是高阶函数的应用
//filter函数的使用
const nums = [10, 20, 30, 40, 554];
//过滤 会回调五次
//filter中的回调函数有一个要求:必须返回一个布尔值
//true:当返回true时,函数内部会自动将这次回调的n加入到新的数组中
//false:当返回false时,函数内部会过滤到这次n
let newNums =nums.filter(function(n){
return n<100;
})
//console.log(newNums)
//map的函数的使用
let new2Nums=newNums.map(function (n){
return n*2;
})
console.log(new2Nums)
//3.reduce函数的使用
//reduce作用对数组中所有的内容进行汇总
// new2Nums.reduce(function(preValue,n){
// return 100;
// },0)
// //第一次:preValue是0(因为初始化为0) n为20(数组中的第一个值)
// //第二次:preValue是100(因为初始化为0) n为40(数组中的第二个值)
// //第二次:preValue是100(因为初始化为0) n为60(数组中的第二个值)
// //第二次:preValue是100(因为初始化为0) n为80(数组中的第二个值)
let total=new2Nums.reduce(function(preValue,n){
return preValue+n;
},0)
console.log(total);
//第一次:preValue是0(因为初始化为0) n为20(数组中的第一个值)
//第二次:preValue是100(因为初始化为20) n为40(数组中的第二个值)
//第三次:preValue是100(因为初始化为60) n为60(数组中的第二个值)
//第四次:preValue是100(因为初始化为120) n为80(数组中的第二个值)
//200
更简便的写法
const nums2 = [10, 20, 30, 40, 554];
let total2=nums.filter(function(n){
return n<100;
}).map(function(n){
return n*2;
}).reduce(function(preValue,n){
return preValue+n;
},0)
console.log(total2);
//更离谱的简便写法
let total3=nums.filter(n=> n<100).map(n=> n*2).reduce((pre,n)=>pre+n);
console.log(total3)
运行结果