JavaScript中结合递归的通用高阶函数实现问题咨询
问题错误分析
你的原始实现有两个核心问题:
- 误用剩余参数
...args:无论你传入什么类型的参数,args永远是数组类型,因此args.map判断永远为真,永远不会执行基础处理函数的逻辑 - 递归调用对象错误:
apply2Array是接收基础函数返回包装函数的高阶函数,本身不能直接处理输入值,递归时应该调用当前已绑定基础函数的包装后函数,而非高阶函数本身
正确实现思路
通用高阶函数apply2Array的逻辑如下:
- 接收任意单值处理函数
fn作为入参 - 返回一个包装后的处理函数,该函数仅接收单个输入(你需求中输入要么是单值要么是单个数组,不需要支持多参数输入)
- 包装函数逻辑:
- 用
Array.isArray判断输入是否为数组,比判断是否存在map方法更严谨,可避免类数组对象的误判 - 如果是数组:遍历每个元素,递归调用当前包装函数处理每个元素
- 如果不是数组:直接调用
fn处理输入值
- 用
完整实现代码
const apply2Array = fn => { // 定义包装函数,用于递归调用 const wrapper = input => Array.isArray(input) ? input.map(item => wrapper(item)) : fn(input) return wrapper } // 测试用例 const convertF2C = x => (x - 32) / 1.8; const arrayResult = apply2Array(convertF2C); const A = [5, 14, 23, 32, 41]; const B = 50; console.log(arrayResult(A)); // 输出: [-15, -10, -5, 0, 5] console.log(arrayResult(B)); // 输出: 10
补充说明:该实现也支持嵌套数组的处理,例如输入[5, [14, 23], [32, [41]]]也可以递归处理所有层级的元素
内容的提问来源于stack exchange,提问作者NCL82409
相关产品推荐
相关产品推荐

