去往js函数式编程(5)

日志记录

  我们可以写一个高阶函数,它以两个函数作为参数,并允许第一个函数只能执行一次,从那一点开始调用第二个函数。

const onceAndAfter = (f, g) => {
  let toCall = f
  return (...args) => {
    let result = toCall(...args)
    toCall = g
    return result
  }
}

const squeak = (x) => console.log(x, 'squeak!!')
const creak = (x) => console.log(x, 'creak!!')
const makeSound = onceAndAfter(squeak, creak)

makeSound('door') // "door squeak!!"
makeSound('door') // "door creak!!"
makeSound('door') // "door creak!!"
makeSound('door') // "door creak!!"

  从性能上来说,差异可能微不足道。展示这种进一步变化的原因是要表明,通过存储函数,你通常可以以更简单的方式产生结果。在过程式编程中,使用标志来存储状态是一种常见的技术。

逻辑反选函数

  filter 方法给一个方法,我们可以对数组进行过滤,只包括方法为真的元素。如果进行反向过滤,如何处理呢。我们可以编写一个高阶函数,它将接受任何方法,然后对其结果取反。

const notDelinquent = serviceResult.accountsData.filter((v) => v.balance >= 0)
const notDelinquent2 = serviceResult.accountsData.filter(
  (v) => !(v.balance < 0)
)

// 上面是两种等效的写法
const not =
  (fn) =>
  (...args) =>
    !fn(...args)

const isNegativeBalance = (v) => v.balance < 0
const notDelinquent3 = serviceResult.accountsData.filter(not(isNegativeBalance))

// 还有一种解决方案,编写一个新的过滤方法,和filter()相反。
const filterNot = (arr) => (fn) => arr.filter(not(fn))

  这个解决方案与 filter()不完全匹配,但是你可以将它添加到 Array.prototype 中,或者应用一些方法。

  西班牙于排序中代码是这样写的。

const spanishComparison = (a, b) => a.localeCompare(b, 'es')
palabras.sort(spanishComparison)

  如何将许进行排序?编写一个函数,以反转比较函数的结果。将 a,b 换下位置。编写一个 sortDescending 方法,它与 sort 相反工作。const invert =fn =>(...args)=>-fn(...args)

posted @ 2023-06-01 16:03  艾路  阅读(8)  评论(0编辑  收藏  举报