如何根据数字数组长度程序化链式调用sum柯里化函数并以空括号收尾
实现方案
你给出的sum是典型的单参数柯里化累加函数,靠传入空参触发结果返回,适配任意长度数字数组不需要动态拼接调用代码,用数组的reduce方法即可实现程序化链式调用。
完整实现代码
// 原有柯里化累加函数 let sum = a => b => b ? sum(a + b) : a; // 任意长度的数字数组 let arrayValue = [1,2,3,4,5]; // 逐次传入数组元素完成链式调用,最后空参触发结果返回 const total = arrayValue.reduce((currentFunc, num) => currentFunc(num), sum)(); console.log(total); // 输出 15,等价于sum(1)(2)(3)(4)(5)()的执行结果
逻辑说明
- 把reduce的初始值设置为最外层的
sum函数 - 遍历数组每一项时,执行上一轮返回的待调用函数、传入当前数字,得到下一层等待传参的新函数
- 数组遍历完成后,所有数字已经按顺序传入了调用链,最后追加一次空参
()调用,就会触发sum的终止判断,返回最终累加结果
比如传入测试数组[10,20,3,4],执行后得到结果37,和示例sum(10)(20)(3)(4)()运行结果完全一致。
边界兼容
如果需要兼容空数组场景,加一层长度判断即可,避免直接空参调用sum得到异常值:
const total = arrayValue.length ? arrayValue.reduce((currentFunc, num) => currentFunc(num), sum)() : 0;
这个方案对数组长度没有限制,哪怕数组有上百个元素,也能正确生成对应长度的调用链,不需要用eval之类的危险语法动态拼接执行代码。
内容的提问来源于stack exchange,提问作者Muhammad Tahir
相关产品推荐
相关产品推荐

