JS高阶函数、pipe&reduce

定义:把函数作为参数或者返回值的函数

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)

你可能感兴趣的:(javascript,原型模式,前端)