高阶函数:filter map reduce

高阶函数:filter map reduce
这三个高阶函数都是数组中有几项就执行几次
编程范式:面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)

const nums = [10, 20, 111, 222, 444, 40, 50]
//1、需求:去除所有小于100的数字
    let newNums = []
    for(let n of nums){
        if(n < 100){
            newNums.push(n)
        }
    }
//2、需求:将所有小于100的数字进行转化:全部乘以2
    let new2Nums = []
        for(let n of nums){
            if(n < 100){
                newNums.push(n * 2)
            }
        }
    console.log( new2Nums )
//3、需求:将所有new2Nums数字相加,得到最终的结果
    let total = 0;
        for(let n of new2Nums){
            total += n;
        }
    console.log( total )

以上写法用高阶函数会简便很多

const nums = [10, 20, 111, 222, 444, 40, 50]
//作用:filter中的回调函数有一个要求:必须返回一个boolean值
//true:当返回true时,函数内部会自动将这次回调的n加入到新数组中
//false:当返回在false时,函数内部会过滤掉这次的n
//filter的用法
    let newFilter = nums.filter(function(n){
        return n < 100;
        })
    console.log( newFilter )//10 20 40 50
//map的使用
//作用:对数组中的每一项都进行变化
    let newMap = newFilter.map(function(n){
        return n * 2
    })
    console.log( newMap )//20 40 80 100
//reduce的使用
//作用:对数组中所有的内容进行汇总
//reduce()里的回调函数有是2个参数,第一个参数是一个函数
//第二个参数表示初始值
//第一个参数是一个函数,函数有2个参数第一个参数是表示上一个值
//在这里perVal是0,因为有初始值是0,第二个参数n表示数组里的每一项值
    let newReduce = newMap.reduce(function(perVal, n){
        return perVal + n;
    },0)
    console.log( newReduce )//240
    //第一次:preVal是0    n是20
    //第二次:preVal是20   n是40
    //第三次:preVal是60   n是80
    //第四次:preVal是140  n是100
    //240

//以上还可以写成
    let total = nums.filter(function(n){
        return n < 100
    }).map(function(n){
        return n * 2
    }).reduce(function(perVal,n){
        return perVal + n
    },0)
    console.log( total )
//箭头函数更简洁
    let total = nums.filter(n => n < 100).map(n => n * 2).reduce((pre, n) => pre + n);
    console.log( total )

你可能感兴趣的:(高阶函数:filter map reduce)