一. 复合函数
思路
参考reduce
解决方法
- 定义一个变量用来记录上一次函数执行后的结果pre,让其默认为x
- 从后向前开始循环functions,根据索引取出当前要执行的函数进行执行,将执行结果保存到pre进行累加
- 最终返回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对象进行缓存结果
解决方法
- 定义一个变量cache和idPool用来进行执行结果和参数类型的缓存,并将参数进行字符串化,用来当作缓存的key
- 从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
*/