cache缓存函数实现

function cache(fn) {
    let obj = Object.create(null);
    return function (...args) {
        args = [...args.sort()];
        args = args.map(item => {
            return (function sortObject(item) { 
                if (typeof item !== 'object') {
                    return item
                 } else {
                     let newObj = Object.create(null);
                    for (let key of Object.keys(item).sort()) {
                        if (typeof item[key] === 'object') {//考虑值是对象的情况
                             item[key] = sortObject(item[key])
                         }
                         newObj[key] = item[key]
                     }
                     return newObj
                }
            })(item)
        })
        let _key = JSON.stringify(args);
            return obj[_key] || ( obj[_key] = fn.apply(fn, args))
    }
} 

// f1('abc', 123, { b: 3 });    // 5, 1000s
// f1('abc', 123, { b: 3 });    // 5, 1000s

function f1() {
    console.log('调用f1', arguments);
    return arguments
}
// f2 = cache(f1);
// f2('abc', 123, { b: 3 });    // 5, 1000s
// f2('abc', 456, { c: 3 });    // 3, 500s
// f2('abc', 123, { b: 3 });    // 5, 0s

let f2 = cache(f1)
console.log(f2('abc', 123, { a:2,b: 3 }))
console.log(f2('abc', 123, { b: 3, a: {c:4,d:5}}))
console.log(f2('abc', 123, { b: 3, a: {d:5,c:4} }))
console.log(f2('abc', 123, { b: 3, a:{c:4,d:5,e:6} }))

你可能感兴趣的:(cache缓存函数实现)