定义:把函数作为参数或者返回值的函数
JS内置的高阶函数:
Function.prototype.call
Function.prototype.bind
Function.prototype.apply
Array.prototype.sort
Array.prototype.filter
Array.prototype.reduce
Array.prototype.map
函数的组合:
function doubleSay(str){
return str +', ' + str
}
function capitalize(str){
return str[0].toUpperCase() + str.substring(1)
}
function exclaim(str){
return str + '!'
}
let result = explaim(capitalize(doubleSay('hello')))
result // => "Hello hello!"
使用pipe操作
const addOne = x => x + 1
const addTwo = x => x + 2
addTwo(addOne(1)) // 4
// 使用pipe写法
const pipe = (func1, func2) => x => func2(func1(x))
const addThree = pipe(
addOne,
addTwo
)
addThree(1)
如果是多个参数呢?
可以使用reduce来构造pipe函数
const pipe = ...args => x =>
args.reduce(
(outputValue, currentFunction) => currentFunction(outputValue),
x
)
或者使用Ramda.js
const say = R.compose(doubleSay,capitalize,exclaim)
let result = say('hello')
在此补充reduce的用法:
reduce对数组中的每个元素执行一个您提供的reduce方法,并将其结果汇总为单个返回值。
下面是reduce的常用使用方法:
数组扁平化:
const arr = [[2], [2, 3], [1]]
const sum = arr.reduce((prev, curr) => {
return prev.concat(curr)
})
算法返回数组第三大的数:
function thirdMax(nums: number[]): number {
// 数组排序
let arr = nums.sort((a, b) => {
return a>b ? -1: 1
})
// 数组去重
arr = arr.reduce((prev:number[], cur,index) => {
if (prev.indexOf(cur) === -1) {
prev.push(cur)
}
return prev
}, [])
// 返回第三大的数
if (arr.length >= 3) {
return arr[2]
} else {
return arr[0]
}
};
const res = thirdMax([3, 2, 1])
console.log(res)
使用reduce数组去重
// reduce数组去重
const res3 = names.reduce((prev: string[], cur) => {
if (prev.indexOf(cur) === -1) {
prev.push(cur)
}
return prev
}, [])
console.log(res3)
返回数组中的最大值:
const arr2 = [2, 12, 13, 1]
const res4 = arr2.reduce((prev, cur) => Math.max(prev, cur))
console.log(res4)
筛选数组中的偶数
const res5 = arr2.reduce((prev:number[], cur) => {
if (cur % 2 === 0) {
prev.push(cur)
}
return prev
},[])
console.log(res5)
数组中每个元素出现的次数:
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']
type obj = {
[k:string]:number
}
let tempObj:obj = {}
const res2 = names.reduce((prev, cur) => {
if (cur in prev) {
prev[cur] ++
} else {
prev[cur] = 1
}
return prev
},tempObj)
console.log(res2)