复习JS基础之复合和记忆函数的实现

194 阅读1分钟

一. 复合函数

思路

参考reduce

解决方法

  1. 定义一个变量用来记录上一次函数执行后的结果pre,让其默认为x
  2. 从后向前开始循环functions,根据索引取出当前要执行的函数进行执行,将执行结果保存到pre进行累加
  3. 最终返回pre即可

实现

/**
 * @param {Function[]} functions
 * @return {Function}
 */
var compose = function(functions) {
    const len = functions.length;
    let pre;
    return function(x) {
        pre = pre || x;
        for (let i = len - 1; i >= 0; --i) {
            pre = functions[i](pre);
        }
        return pre;
    }
};

/**
 * const fn = compose([x => x + 1, x => 2 * x])
 * fn(4) // 9
 */

二. 记忆函数二

思路

通过Map或者Object对象进行缓存结果

解决方法

  1. 定义一个变量cache和idPool用来进行执行结果和参数类型的缓存,并将参数进行字符串化,用来当作缓存的key
  2. 从cache中判断是否存在,存在的话直接从cache中获取之后返回,不存在,就将函数的执行结果添加到cache中,进行缓存,并返回其执行结果

实现

/**
 * @param {Function} fn
 */
function memoize(fn) {
    let cache = new Map();
    let idPool = new Map();
    return function(...args) {
        let key = args.map(getId).join(',');
        if (cache.has(key)) {
            return cache.get(key);
        }
        const result = fn(...args);
        cache.set(key, result);
        return result;
    }
    
    function getId(o) {
        if (idPool.has(o)) {
            return idPool.get(o);
        }
        const id = idPool.size;
        idPool.set(o, id);
        return id;
    }
}


/** 
 * let callCount = 0;
 * const memoizedFn = memoize(function (a, b) {
 *	 callCount += 1;
 *   return a + b;
 * })
 * memoizedFn(2, 3) // 5
 * memoizedFn(2, 3) // 5
 * console.log(callCount) // 1 
 */