【问题标题】:I'm trying to rewrite memoize in javascript (for underscore), can someone explain this?我正在尝试用javascript重写memoize(下划线),有人可以解释一下吗?
【发布时间】:2017-03-01 04:46:10
【问题描述】:

我知道 memoize 的目的是缓存值,这样代码就可以更快地运行,而不必每次都重新计算相同的答案。我的问题源于返回一个函数(我认为)。 google chrome 调试器在这里对我来说不是那么有用,因为每次我尝试运行这个 memoize 函数时,它只是从 argus 变量(我相信在第 4 行)一直到分号。此外,result 总是返回一个空对象,而不是在 result 中存储一个值。

我先定义一个函数:

function add(a,b){
  return a+b;
}

这是我对 memoize 功能的尝试:

  _.memoize = function(func) {

    var result = {};
    var flag = 0;
    var argus = Array.prototype.slice.call(arguments)
    return function() {
        
        if(result[key] === arguments){
            flag = 1
        }
        else if(flag = 0){
          result[argus] = func.apply(this, argus);
        }
        
      return result[argus];
    };
  };

我会通过执行 _.memoize(add(2,5)) 来调用 memoize,但结果不会存储在结果对象中。

我是否接近让这个 memoize 功能正常工作?你们可以在这里提供的任何指导将不胜感激。

【问题讨论】:

  • 我在下面添加了一个答案,但这里有两个明显的错误:(1)您使用的key 变量未在任何地方定义或赋值(2)您有if(flag = 0)= 运算符用于赋值,而不是比较。
  • 谢谢,这让我明白了。我真的挂了。

标签: javascript memoization


【解决方案1】:

你最缺的一点是_.memoize首先在函数上被调用,它返回一个新函数。您在函数调用的 result 上调用它(在本例中为数字 7)。

为了让它工作,你需要重新安排一些事情。

还要注意,尝试使用数组本身作为对象的索引是不明智的。解决此问题的一种方法是将参数数组转换为 JSON 并将其用作results 对象的索引:

function add(a, b) {
  console.log('Called add(' + a + ', ' + b + ')');

  return a + b;
}

var _ = {};

_.memoize = function(func) {
  var results = {};
  return function() {
    var args = Array.prototype.slice.call(arguments);
    var key = JSON.stringify(args);

    if (!(key in results)) {
      results[key] = func.apply(this, args);
    }

    return results[key];
  };
};

var madd = _.memoize(add);

console.log(madd(2, 4));
console.log(madd(9, 7));
console.log(madd(2, 4));

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多