高阶函数的意义:
代码开发过程中要学会多用高阶函数。但凡需要循环遍历数组的情况都要考虑是否可以是否高阶函数。避免代码冗余复杂难度。
高阶函数用来抽象通用的问题,让我们只需要关注于目标,忽略细节;
可以让函数变得灵活[比如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