js 高阶函数的概念,用法,常用的高阶函数

高阶函数的意义:

代码开发过程中要学会多用高阶函数。但凡需要循环遍历数组的情况都要考虑是否可以是否高阶函数。避免代码冗余复杂难度。

高阶函数用来抽象通用的问题,让我们只需要关注于目标,忽略细节;

可以让函数变得灵活[比如filter函数中,fn就可以根据实际情况自定义.]

		// 面向过程的方式
        let arr = [1,2,3];
        for(let i = 0;i<arr.length;i++) {
            console.log(arr[i]);
        };
        //高阶函数的方式:使用封装的函数,直接使用功能,省略具体的实现过程
        let array1 = [1,2,3,56,8];
        array1.forEach(item => {
            console.log(item);
        });

		function filter (array,fn) {  
            let results = [];
            for(let i = 0;i<array.length;i++) {
                if(fn(array[i])) {//如果数组中的这个元素满足条件fn,就把该元素存储在数组results中
                    results.push(array[i]);
                }
            }
            return results;
        }
        let r = filter(array1, item => {
            return item % 2 === 0;
        });
        console.log(r);

常用的高阶函数

  • forEach
  • filter:回调函数返回一个布尔值。为true则加入新数组,为false则过滤掉。最终结果生成一个新数组
let arr=[1,2,3,4]
let newarr = arr.filter(function(n) {
	return n>2
}) //newarr =====[3,4]
  • map: 依次处理数组中的元素。返回一个新数组
let arr=[1,2,3,4]
let newarr = arr.map(function(n) {
	return n*2
})   //newarr =====[2,4,6,8]
	js数组函数,不改变原始数组,返回新数组;按照原始数组元素的顺序依次处理元素;不会检测空数组;
  • every:

     用来判断数组中的[每个元素]是否[都]满足某个条件;按照原始数组元素的顺序依次处理元素;
    
  • some:

     用于检测数组中是否有元素满足指定条件[只要有一个元素满足就行];按照原始数组元素的顺序依次处理元素;
    
  • find/findIndex

  • reduce:对数组中所有的内容进行汇总。累乘或者累加

reduce(参数1,参数2)
reduce(fn,initvalue)
reduce(function(){},0)

let arr = [1,2,3]
let total= arr.reduce(function(prevalue,n){
	return prevalue + n
	//return prevalue * n  除了累加还可以累乘
},0)//数组中有几个元素,就会执行几次。
//第一次执行的时候:prevalue为初始值0,n为当前元素1。
//第二次的时候,prevalue为0+1的值1,n为当前元素2。
//第三次执行的时候,prevalue为1+2的值3,n为当前元素3  所以最终返回结果为6

对象数组中使用reduce
this.books.reduce(function(prevalue,book){
	return prevalue + book.price * book.count;
},0);


  • sort :排序
arr.sort()//排序  比如数组顺序cba,排序后会变成abc

实例:

let total = arr.filter(n=>n<100).map(n=>n*3).reduce((prevalue,n)=>prevalue+n,0);
//将数组arr先过滤,只留下所有<100的元素,再将filter后新生成的数组所有元素都*3,再将reduce后新生成的数组进行累加
		// map
        const map = (array,fn) => {//此处map函数的参数fn是一个高阶函数,由于fn是开发者自定义的,所以对于数据的处理具有灵活性
            let results = [];
            for(let value of array) {//遍历数组,将数组中的元素都通过fn处理,并将处理后的元素生成新的数组results
                results.push(fn(value));
            }
            return results;
        }
        let arr = [1,2,3,4];
        arr = map(arr,v => v*v);//将返回的新数组重新赋值给arr
        console.log(arr);//[1,4,9,16]
        
        // every
        const every = (array,fn) => {
            let result = true;//假设数组中所有元素都匹配条件  
            for (let value of array) {//遍历元素判断元素是否匹配条件fn
                result = fn(value);
                if (!result) {//如果有元素不满足条件,说明这个数组中并非每个元素都匹配条件,直接跳出循环
                    break;
                }
            }
            return result;
        }
        let array = [0,1,3,5,6];
        array = every(array, v => v>0 );//判断数组中的元素是否都>0
        console.log(array);//false

        // some
        const some = (array,fn) =>{
            let result = false;
            for(let value of array) {
                result = fn(value);//如果满足条件  true
                if(result) {//如果有一个元素满足条件,直接break.因为some函数就是检测数组中是否有元素会满足条件,只要有一个满足条件就成立
                    break;
                }
            }
            return result;
        }
        let ss = [3,6,8,1];
        ss = some(ss,v => v==1);
        console.log(ss);//true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值