尝试使用 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 检查是不是设置了至少一个参数
修改 String/Integer 对象并检查它是不是影响以该对象为参数的类对象