高阶函数
高阶函数是对其他函数进行操作的函数,可以将它们作为参数或通过返回它们。简单来说,高阶函数是一个函数,它接收函数作为参数或将函数作为输出返回。
例如Array.prototype.map
,Array.prototype.filter
并且Array.prototype.reduce
是一些高阶功能,内置的语言。
1. Array.prototype.map
该map()
方法通过调用作为输入数组中每个元素的参数提供的回调函数来创建一个新数组。该map()
方法将从回调函数中获取每个返回值,并使用这些值创建一个新数组。
传递给回调函数map()
方法接受3个参数:element,index,和array。
假设我们有一个数组,我们想要创建一个新数组,其中包含第一个数组的每个值的两倍。让我们看看如何使用和不使用高阶函数来解决问题。
不用高阶函数
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]
创建自定义高阶函数
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);
2. Array.prototype.filter
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
//返回数组 ages 中所有元素都大于 18 的元素: var ages = [32, 33, 16, 40]; var result = ages.filter( item => { return item >= 18}) // 输出结果 32,33,40
3. Array.prototype.reduce
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次。
reduce的简单用法
// 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