多次调用函数并保存结果
calling a function several times with saving result
我有一个问题。
我需要设计一个函数 add()
来总结给定的参数。问题是它应该可以通过以下几种方式调用:
add(1, 2, 3, 4, 5) // outputs 15
add(1, 2)(3)(4, 5) // outputs 15
add(1, 2, 3)(4, 5) // outputs 15
如果函数的内部没有问题并且可以这样实现:
return arg.reduce((prev, current) => prev + current)
参数个数始终为5个,不多也不少
但是,我不确定如何处理这里的连续调用。有人有什么想法吗?
非常感谢。
有 add
return 一个在其范围内有一个持久数组的函数,它会累积地跟踪所有传入的参数。在每次调用时,push
到该数组 - 一旦该数组有 5 个项目,return 求和数组作为一个数字,否则,return 相同的函数:
function add(...initialArgs) {
const allArgs = [];
function inner(...args) {
allArgs.push(...args);
return allArgs.length === 5
? allArgs.reduce((a, b) => a + b)
: inner;
}
return inner(...initialArgs)
}
console.log(add(1, 2, 3, 4, 5)) // outputs 15
console.log(add(1, 2)(3)(4, 5)) // outputs 15
console.log(add(1, 2, 3)(4, 5)) // outputs 15
当然,这取决于事先知道参数总数总是恰好为 5。
这是一种通用方法,您可以将动态参数传递给下面的 "add" 函数,"parseAdd" 函数会处理它。
总的来说这个问题属于"currying"函数的范畴,值得一读。此外,了解 bind and function.toString() 将有助于您更好地理解这种方法。
function addition(...args) {
return args.reduce((conc, v) => conc += v ,0)
}
function parseAdd(fn) {
var newFn = fn.bind(null);
function cal(...args) {
newFn = newFn.bind(null, ...args);
return cal;
}
cal.toString = () => newFn();
return (...arg) => { newFn = fn.bind(null); return cal(...arg) }
}
var add = parseAdd(addition);
console.log(add(1,2,3,4))
console.log(add(1,2,3)(4)(5))
console.log(add(1)(2)(3)(4)(5)(6))
我有一个问题。
我需要设计一个函数 add()
来总结给定的参数。问题是它应该可以通过以下几种方式调用:
add(1, 2, 3, 4, 5) // outputs 15
add(1, 2)(3)(4, 5) // outputs 15
add(1, 2, 3)(4, 5) // outputs 15
如果函数的内部没有问题并且可以这样实现:
return arg.reduce((prev, current) => prev + current)
参数个数始终为5个,不多也不少
但是,我不确定如何处理这里的连续调用。有人有什么想法吗?
非常感谢。
有 add
return 一个在其范围内有一个持久数组的函数,它会累积地跟踪所有传入的参数。在每次调用时,push
到该数组 - 一旦该数组有 5 个项目,return 求和数组作为一个数字,否则,return 相同的函数:
function add(...initialArgs) {
const allArgs = [];
function inner(...args) {
allArgs.push(...args);
return allArgs.length === 5
? allArgs.reduce((a, b) => a + b)
: inner;
}
return inner(...initialArgs)
}
console.log(add(1, 2, 3, 4, 5)) // outputs 15
console.log(add(1, 2)(3)(4, 5)) // outputs 15
console.log(add(1, 2, 3)(4, 5)) // outputs 15
当然,这取决于事先知道参数总数总是恰好为 5。
这是一种通用方法,您可以将动态参数传递给下面的 "add" 函数,"parseAdd" 函数会处理它。
总的来说这个问题属于"currying"函数的范畴,值得一读。此外,了解 bind and function.toString() 将有助于您更好地理解这种方法。
function addition(...args) {
return args.reduce((conc, v) => conc += v ,0)
}
function parseAdd(fn) {
var newFn = fn.bind(null);
function cal(...args) {
newFn = newFn.bind(null, ...args);
return cal;
}
cal.toString = () => newFn();
return (...arg) => { newFn = fn.bind(null); return cal(...arg) }
}
var add = parseAdd(addition);
console.log(add(1,2,3,4))
console.log(add(1,2,3)(4)(5))
console.log(add(1)(2)(3)(4)(5)(6))