[Javascript] Write memoize function

class MemoizeMap {
  constructor() {
    this._map = new Map();
    this._weakMap = new WeakMap();
  }

  _isObject(v) {
    return typeof v === "object" && v !== null;
  }

  set(key, value) {
    if (this._isObject(key)) {
      this._weakMap.set(key, value);
    } else {
      this._map.set(key, value);
    }
  }

  get(key) {
    if (this._isObject(key)) {
      return this._weakMap.get(key);
    } else {
      return this._map.get(key);
    }
  }

  has(key) {
    if (this._isObject(key)) {
      return this._weakMap.has(key);
    } else {
      return this._map.has(key);
    }
  }
}

function memoize(func, resolver) {
  function memoized(...args) {
    const key = resolver ? resolver(...args) : args[0];
    const cache = memoized.cache;
    if (cache.has(key)) {
      return cache.get(key);
    }
    const result = func.apply(this, args);
    cache.set(key, result);
    return result;
  }
  memoized.cache = new MemoizeMap();
  return memoized;
}

var object = { a: 1, b: 2 };
var other = { c: 3, d: 4 };

var values = memoize((obj) => Object.values(obj));
console.log(values(object)); // [ 1, 2 ]

console.log(values(other)); // [ 3, 4 ]

object.a = 2;
console.log(values(object)); // [ 1, 2 ]

values.cache.set(object, ["a", "b"]);
console.log(values(object)); // [ 'a', 'b' ]

 

posted @   Zhentiw  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2022-10-21 [Typescript] 62. Medium - Fibonacci Sequence
2022-10-21 [Typescript] 61. Medium. - Flip
2021-10-21 [AWS] RTO & RPO
2020-10-21 [Kotlin] Compare Functional Programming in Java and Kotlin
2020-10-21 [Kotlin] Catch Error in Java
2019-10-21 [VSCode] Custom settings
2019-10-21 [Flutter] Use http package to get data from network
点击右上角即可分享
微信分享提示