向内联函数数组传递参数:multiMap函数实现问题排查
问题分析与解决方案
你的核心问题在于没有遍历回调函数数组中的所有函数,只执行了单个回调(甚至调用方式错误),导致每个键对应的结果数组只有一个元素。
错误原因拆解
- 你最初用的
arrCallbacks.apply(null, arrVals[i])完全误用了apply方法:apply是用来给单个函数传递参数数组的,而arrCallbacks是函数数组,这行代码根本无法正确执行。 - 后来尝试的
[arrCallbacks[i](arrVals[i])],只是取了回调数组中第i个函数的结果,没有遍历所有回调,自然无法生成完整的结果数组。
修正后的代码(简洁版)
function multiMap(arrVals, arrCallbacks) { const resultObj = {}; // 遍历每个值 arrVals.forEach(val => { // 用map遍历所有回调,收集每个回调的执行结果 resultObj[val] = arrCallbacks.map(callback => callback(val)); }); return resultObj; } console.log(multiMap(['catfood', 'glue', 'beer'], [ function(str) { return str.toUpperCase(); }, function(str) { return str[0].toUpperCase() + str.slice(1).toLowerCase(); }, function(str) { return str + str; } ]));
更直观的循环版(适合理解底层逻辑)
如果你不习惯用数组方法,也可以用嵌套循环实现:
function multiMap(arrVals, arrCallbacks) { const resultObj = {}; // 外层循环遍历值数组 for (let i = 0; i < arrVals.length; i++) { const currentVal = arrVals[i]; const callbackResults = []; // 内层循环遍历所有回调函数 for (let j = 0; j < arrCallbacks.length; j++) { callbackResults.push(arrCallbacks[j](currentVal)); } resultObj[currentVal] = callbackResults; } return resultObj; }
执行逻辑说明
- 遍历值数组中的每个元素,作为结果对象的键。
- 对每个值,遍历回调函数数组,用当前值作为参数调用每个回调,把所有结果收集成数组。
- 将这个结果数组赋值给对应键,最终返回完整的对象。
内容的提问来源于stack exchange,提问作者LucasAE
相关产品推荐
相关产品推荐

