高阶函数是对其余函数进行操做的函数,能够将它们做为参数或经过返回它们。简单来讲,高阶函数是一个函数,它接收函数做为参数或将函数做为输出返回。es6
例如Array.prototype.map
,Array.prototype.filter
而且Array.prototype.reduce
是一些高阶功能,内置的语言。数组
该map()
方法经过调用做为输入数组中每一个元素的参数提供的回调函数来建立一个新数组。该map()
方法将从回调函数中获取每一个返回值,并使用这些值建立一个新数组。函数
传递给回调函数map()
方法接受3个参数:element,index,和array。spa
假设咱们有一个数组,咱们想要建立一个新数组,其中包含第一个数组的每一个值的两倍。让咱们看看如何使用和不使用高阶函数来解决问题。prototype
不用高阶函数code
1 const arr1 = [1,2,3]; 2 const arr2 = []; 3 for(let i = 0; i <arr1.length; i ++){ 4 arr2.push(arr1 [i] * 2); 5 } 6 //打印[2,4,6] 7 console.log(arr2);
使用高阶函数对象
1 const arr1 = [1, 2, 3]; 2 const arr2 = arr1.map(item => item * 2); //使用es6的箭头函数 打印[2,4,6] blog
建立自定义高阶函数 索引
1 //假设咱们有一个字符串数组,咱们但愿将此数组转换为整数数组,其中每一个元素表示原始数组中字符串的长度。 2 const strArray = ['JavaScript', 'Python', 'PHP', 'Java', 'C']; 3 function mapForEach(arr, fn) { 4 const newArray = []; 5 for(let i = 0; i < arr.length; i++) { 6 newArray.push( 7 fn(arr[i]) 8 ); 9 } 10 return newArray; 11 } 12 const lenArray = mapForEach(strArray, function(item) { 13 return item.length; 14 }); 15 // prints [ 10, 6, 3, 4, 1 ] 16 console.log(lenArray);
filter() 方法建立一个新的数组,新数组中的元素是经过检查指定数组中符合条件的全部元素。ip
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
//返回数组 ages 中全部元素都大于 18 的元素: var ages = [32, 33, 16, 40]; var result = ages.filter( item => { return item >= 18}) // 输出结果 32,33,40
reduce() 方法接收一个函数做为累加器,数组中的每一个值(从左到右)开始缩减,最终计算为一个值。
reduce() 能够做为一个高阶函数,用于函数的 compose。
注意: reduce() 对于空数组是不会执行回调函数的。
语法: arr.reduce(callback,[initialValue]) total :必需。初始值, 或者计算结束后的返回值。 currentValue:必需。当前元素 currentIndex:可选。当前元素的索引 arr:可选。当前元素所属的数组对象。 initialValue:可选。传递给函数的初始值 (做为第一次调用 callback 的第一个参数。) // 计算数组元素相加后的总和: var arr = [1, 2, 3, 4]; var sum = arr.reduce(function(prev, cur, index, arr) { console.log(prev, cur, index); return prev + cur; }) console.log(arr, sum); 打印结果: 1 2 1 3 3 2 6 4 3 [1, 2, 3, 4] 10 //这里能够看出,上面的例子index是从1开始的,第一次的prev的值是数组的第一个值。数组长度是4,可是reduce函数循环3次。
// 1.简单的就是咱们经常使用的数组求和,求乘积了。 var arr = [1, 2, 3, 4]; var sum = arr.reduce((x,y)=>x+y) var mul = arr.reduce((x,y)=>x*y) console.log( sum ); //求和,10 console.log( mul ); //求乘积,24 // 2.计算数组中每一个元素出现的次数 let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; let nameNum = names.reduce((pre,cur)=>{ if(cur in pre){ pre[cur]++ }else{ pre[cur] = 1 } return pre },{}) console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1} // 注意这里设置了 初始值 {} 来存储 pre[cur] key 值;与pre对比含有就自增 // 3.数组去重 let arr = [1,2,3,4,4,1] let newArr = arr.reduce((pre,cur)=>{ if(!pre.includes(cur)){ return pre.concat(cur) }else{ return pre } },[]) console.log(newArr);// [1, 2, 3, 4] // 4.将二维数组转化为一维 let arr = [[0, 1], [2, 3], [4, 5]] let newArr = arr.reduce((pre,cur)=>{ return pre.concat(cur) },[]) console.log(newArr); // [0, 1, 2, 3, 4, 5] // 5.对象里的属性求和 var result = [ { subject: 'math', score: 10 }, { subject: 'chinese', score: 20 }, { subject: 'english', score: 30 } ]; var sum = result.reduce(function(prev, cur) { return cur.score + prev; }, 0); console.log(sum) //60