【问题标题】:Trouble understanding memoize implementation无法理解 memoize 的实现
【发布时间】:2015-06-27 17:45:29
【问题描述】:

answerKey[parameters] 是如何工作的? if Array.prototype.slice.call(参数) 返回一个数组[157, 687], answerKey[parameters] 是存储一个数组作为key吗?

function memoize(mathProblem) {
  var answerKey = {};

  return function(){
    var parameters = Array.prototype.slice.call(arguments);

    if (answerKey[parameters]) {
      console.log('returning cached');
      return answerKey[parameters];
    } else {
      answerKey[parameters] = mathProblem.apply(this, arguments);

      return answerKey[parameters]
    }
  }
};

var multiply = function(a, b){
    return a*b;
}

var memoMultiply = memoize(multiply);

console.log(memoMultiply(157, 687));
=>
107859

console.log(memoMultiply(157, 687))
=>
returning cached
107859

【问题讨论】:

  • 不,它将数组字符串化以将其用作属性名称
  • @Bergi 它不会对它调用的数组进行字符串化 .toString()
  • @TomDDD:这就是我所说的“字符串化”。应该说“转换为字符串”。
  • @Bergi 我只是澄清了很多时间stringify 表示JSON.stringify 会产生不同的字符串。

标签: javascript memoization


【解决方案1】:

方括号表示法将数组转换为字符串

var answerKey = {};
var params = [157, 687];
answerKey[params] = 107859;
answerKey['157,687']; // 107859

所以是的,关键是数组的内容作为字符串。这不是很好的做法。

已请求编辑

一般来说,我尽量避免依赖从 Array.prototype.toString() 创建的字符串,因为它有一些奇怪的行为

例如。嵌套数组被展平

[2, [3, 4], 5].toString(); // '2,3,4,5'

这正在丢失有关源数组的信息,并且与

无法区分
[2, 3, 4, 5].toString();

为了解决此类问题,我建议将数组传递给 JSON.stringify();

JSON.stringify([2, [3, 4], 5]); // '[2,[3,4],5]'
JSON.stringify([2, 3, 4, 5]); // '[2,3,4,5]'

此示例适用于 .toString();,但我认为这是一个坏习惯。

【讨论】:

  • "这不是很好的做法" - 为什么不呢?有什么更好的方法?
  • array .toString() 有时会有奇怪的行为,以后会咬你。考虑这个[2, [3, 4], 5].toString(); 这会产生字符串'2,3,4,5'
  • @Bergi 在这种情况下记忆两个数字时可能可以使用。考虑而不是将数组直接包装在JSON.stringify(params); 中,这将产生一个看起来像实际数组的字符串,并且不会将其展平[157, 687]
  • 好吧,鉴于mathproblem 听起来像是一个只接受普通数字而不是任何数组作为参数的函数,这似乎很好。但我明白你的意思,并希望在你的回答中看到它。
猜你喜欢
  • 2015-12-09
  • 2016-06-24
  • 2014-01-25
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多