提问人:imparante 提问时间:6/17/2023 最后编辑:imparante 更新时间:6/20/2023 访问量:82
js 函数通过乘法器数组重复调用
js function repeatedly invokes through an array of multipliers
问:
我遇到一个错误:.我正在考虑咖喱和部分应用。我希望函数通过乘法器数组正确调用。有人可以解释一下我的功能中缺少什么吗?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]));
答:
在对数组调用数组方法之前,必须将所有参数推送到数组中。或者,您可以使用函数中的参数参数来获取所有参数。
您能分享一下该函数是如何调用的吗?
评论
console.log(solution([3, 4, 5]));
使用该函数作为调用的初始值,并删除最终值:multiply
reduce
()
function solution(multipliers) {
return multipliers.reduce((prev, arg) => prev(arg), multiply);
}
console.log(solution([3, 4, 5]));
function multiply(x) {
return function(y) {
return function(z) {
return x * y + z;
}
}
}
评论
multiply function
return x * y * z
return x * y * z;
return function() { return x * y * z; };
solution
函数定义不正确。如果要计算,则需要按如下方式定义函数。multiply
multiply(3)(4)(5)()
60
multiply
// x is required, y is optional, both are numbers
const getMultiply = (x) => (y) =>
typeof y === "undefined" ? x : getMultiply(x * y);
// 1 is the identity element of multiplication
const multiply = getMultiply(1);
console.log(multiply(3)(4)(5)()); // 60
正确定义后,可以按如下方式定义。multiply
solution
// x is required, y is optional, both are numbers
const getMultiply = (x) => (y) =>
typeof y === "undefined" ? x : getMultiply(x * y);
// 1 is the identity element of multiplication
const multiply = getMultiply(1);
const solution = (multipliers) =>
multipliers.reduce((f, x) => f(x), multiply)();
console.log(solution([3, 4, 5])); // 60
评论
multiply function
您正在以 IIFE 的身份调用调用。这是行不通的,因为在代码中调用 reduce 的结果不是一个函数,而是一个数字。multipliers.reduce(...)
在你提供的代码中,你基本上写道:
function solution(multipliers) {
return (60)(); // 60 here being the result of calling the reduce
}
这解释了您收到的错误。
您需要做的就是省略 IIFE 调用。您的函数将变为:
function solution(multipliers) {
return multipliers.reduce((prev, arg) => {
if (prev) {
return prev(arg);
}
return multiply(arg);
}, null);
}
最后,我建议在这里或这个问题中查看其他一些答案,以便更好地实现您的函数,使其更加通用。multiply
由于 @ghassen-louhaichi 链接到一个相关问题,我只能使用 currying 修改函数:创建一个具有不确定连续调用次数的函数。multiply
function multiply(x) {
return function() {
if (arguments.length == 0) {
return x;
} else {
return multiply(x * arguments[0]);
}
}
}
// 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]));
对 的第一次调用返回内部函数。根据传递给内部函数的参数数量,它按原样返回 的参数值,或者再次调用“乘以”更新的运行总数(从而再次返回要再次调用的内部函数)。multiply
multiply
(此实现的)限制是您必须进行最终调用,而没有参数才能获得最终值。
评论
multiply(3)(4)(5)
返回。无需额外服务。无需额外服务。您已经通过声明嵌套函数来调整操作。3 * 4 + 5
()
solution
solution
multiply
multiply(2)(3)(5)()
2 * 3 * 5 = 60
multiply
multiply(2)(3)(5)
2 * 3 + 5 = 17
return x * y * z