尝试使用 memoization 对象检查参数是不是已被计算...似乎无法处理使用对象作为参数

Posted

技术标签:

【中文标题】尝试使用 memoization 对象检查参数是不是已被计算...似乎无法处理使用对象作为参数【英文标题】:Trying to use memoization object to check if an argument has already been computed... can't seem to handle using objects as arguments尝试使用 memoization 对象检查参数是否已被计算...似乎无法处理使用对象作为参数 【发布时间】:2022-01-13 22:29:06 【问题描述】:

所以我使用内部函数进行闭包,并能够传入未知数量的参数。该函数应该使用某种类型的记忆(我选择使用一个对象)来检查并查看通过回调运行参数的结果是否已经被计算和存储。这是我目前写的函数...

function memoize(func) 
    // Define an object to hold results
    let obj = 
    // define an inner function for closure that takes an argument
    function inner(...arg) 
        if (obj[arg]) 
            return obj[arg]
         else 
            obj[arg] = func(...arg);
            return obj[arg];
        
    
    return inner;

我收到一个错误,我的函数“应该使用对象作为参数”......目前,我不确定为什么我当前的代码不能使用对象作为参数......所以如果有人能解释一下,它将不胜感激。这是用于测试我的功能的算法...

it('should work with objects as arguments', () => 
    const firstTime = timeCheck( foo: 'bar' );
    wait(5);
    const secondTime = fastTimeCheck( foo: 'bar' );
    wait(5);
    expect(firstTime).to.not.equal(secondTime);
    expect(fastTimeCheck( foo: 'bar' )).to.equal(secondTime);
    expect(fastTimeCheck( foo: 'bar' )).to.not.equal(fastTimeCheck( different: 'result' ));
  );

如果你有时间。我很高兴知道为什么我当前的函数不使用对象作为参数...另外,我如何修改我编写的内容以满足测试算法。

【问题讨论】:

对象键必须是字符串,而不是对象。 好的,那对我来说到底是什么意思? 这意味着你不应该将它用于带有对象参数的函数。或者您可以将密钥更改为JSON.stringify(arg) 谢谢!那行得通!现在我只需要阅读它并弄清楚为什么大声笑! 【参考方案1】:

属性名称是字符串或符号。任何其他值(包括数字)都被强制转换为字符串。这会输出“值”,因为 1 被强制转换为“1”。见Property accessors

所以当你调用obj[arg] 时,你实际上调用了obj[arg.toString()] 之类的东西。这里arg 是参数数组,如[foo: 'bar']。尝试拨打[foo: 'bar'].toString(),您将收到[object Object]。请参阅Array.prototype.toString() 和Object.prototype.toString()。

这意味着对于每个对象参数,您将获得相同的密钥。

【讨论】:

感谢您花时间解释为什么它不能将对象用作参数! 如果您在调试代码时打印缓存对象,您可能已经找到了。

以上是关于尝试使用 memoization 对象检查参数是不是已被计算...似乎无法处理使用对象作为参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 IValidatableObject 检查是不是设置了至少一个参数

检查传递给方法的对象是不是为“this”

修改 String/Integer 对象并检查它是不是影响以该对象为参数的类对象

在 Java 中对资源使用 try 是不是安全 - 它是不是检查可关闭对象是不是不为空,是不是在尝试关闭它时捕获异常

使用 quick.db 检查用户是不是有特定对象

Perl性能优化之Memoize的实现原理