我遇到了一个错误:Uncaught TypeError TypeError: multipliers.reduce(...) is not a function
。我在看咖喱和部分应用程序。我期望multiply
函数通过乘法器数组正确调用。有人能解释一下我的multiply
函数中缺少了什么吗?
multiply函数,将整数相乘,但以特殊的方式。函数的输出可以被反复调用,直到您不带参数地调用它为止。例如,multiply(3)(4)(5)()
应该返回3 * 4 * 5 = 60
。我使用了一个辅助函数solution(multipliers)
,它获取所有乘数,然后将它们传递给multiply
,如上所述。
输入
multipliers: [3, 4, 5]
输出量
60
代码
function multiply(x) {
return function(y) { // anonymous function
return function(z) { // anonymous function
return x * y * z;
}
}
}
// this function lets you invoke something like multiply(3)(4)(5)() with dynamic arguments
function solution(multipliers) {
return (multipliers.reduce((prev, arg) => {
if (prev) {
return prev(arg);
}
return multiply(arg);
}, null))();
}
console.log(solution([3, 4, 5]));
5条答案
按热度按时间icomxhvb1#
在调用数组方法之前,必须将所有参数都压入数组。或者你可以使用函数内部的arguments参数来获取所有的参数。
你能分享一下这个函数是如何被调用的吗?
6kkfgxo02#
使用
multiply
函数作为reduce
调用的初始值,并删除最后的()
:bejyjqdl3#
multiply
函数定义不正确。如果你想让multiply(3)(4)(5)()
计算为60
,那么你需要定义multiply
函数如下。正确定义
multiply
后,可以按如下方式定义solution
。vxbzzdmp4#
您正在以IIFE的身份调用对
multipliers.reduce(...)
的调用。这是行不通的,因为在代码中调用reduce的结果不是一个函数,而是一个数字。在你提供的代码中,你基本上写了:
这就解释了你收到的错误。
您所需要做的就是省略IIFE调用。您的函数变为:
最后,我建议在这里或this question中查看一些其他答案,以更好地实现
multiply
函数,使其更通用。j9per5c45#
我只能使用currying修改
multiply
函数,这要感谢@ghassen-louhaichi提供的一个相关问题的链接:Create a function with an undetermined number of successive calls。第一次调用
multiply
,返回内部函数。根据传递给内部函数的参数数量,它返回multiply
参数的值,或者它再次调用“multiply”与更新的运行总数(从而再次返回要再次调用的内部函数)。这个实现的局限性是你必须进行一个没有参数的最终调用才能得到最终值。