Saber2pr's Blog

memorize函数

要求:接受一个函数参数,返回它的 memo 后的版本。

原理:准备一个 map,用来记录函数的参数和对应结果。函数执行前,在 map 中查找输入记录,如果有,则直接返回对应结果,跳过函数执行;否则执行函数,并将参数和对应返回值存入 map。

map 空间需设置最大值

const store = new WeakMap() // 记录函数对应输入记录的map
const MAX_SIZE = 10 // memo最大数量

const memo = (fn, thisArg) => (...args) => {
  // 从map中查找fn对应的记录,meta类型Array<[any[], any]>
  const meta = store.get(fn) || []

  // 存在输入记录
  if (meta.length) {
    // 查找输入对应结果
    const mo = meta.find(([p]) => diff(p, args))
    // 返回对应结果
    if (mo) return mo[1]
  }

  // 没有记录,执行函数
  const O = fn.apply(thisArg, args)

  // 保存参数和对应结果
  meta.push([args, O])
  store.set(fn, meta)

  // 清理溢出记录
  while (meta.length >= MAX_SIZE) meta.shift()

  // 返回函数执行结果
  return O
}

diff 函数用于浅比较两个数组是否相同(基本类型值的数组)

例如 diff([1, '2'], [1, '2'])结果为 true

const diff = (a, b) => {
  let i = a.length > b.length ? a.length : b.length

  while (i--) if (a[i] !== b[i]) return false

  return true
}