为什么我自定义的数组map方法的callback回调没有生效?
我编写了代码遍历给定数组,对每个元素调用subtractTwo函数,但运行自定义的高阶函数map时,传入的数组返回后完全没有变化,有人知道这是什么原因导致的吗?
// 你的原始代码 function subtractTwo (number) { return number - 2; } function map (array, callback) { for (let i = 0; i < array.length; i ++) { callback(array[i]); } return array; } console.log(typeof subtractTwo); // should log: 'function' console.log(typeof map); // should log: 'function' console.log(map([3,4,5], subtractTwo)); // should log: [ 1, 2, 3 ]
问题原因
- 回调函数的返回值没有被存储:你在循环中仅执行了
callback(array[i]),没有保存计算结果,数值属于值传递类型,单纯调用回调不会直接修改原数组的对应元素 - 直接返回了原始输入数组:你没有创建新容器存储处理后的结果,最终返回的是未做任何修改的原数组,自然看不到变化
修复代码
按照原生map不修改原数组、返回新数组的规范,修改后代码如下:
// subtractTwo回调函数 function subtractTwo (number) { return number - 2; } // 自定义高阶函数map function map (array, callback) { // 新建数组存储处理后的结果,不修改原数组 const resultArr = [] for (let i = 0; i < array.length; i ++) { // 将每个元素经过回调处理后的结果存入新数组 resultArr.push(callback(array[i])) } return resultArr } // 测试 console.log(typeof subtractTwo); // 输出: 'function' console.log(typeof map); // 输出: 'function' console.log(map([3,4,5], subtractTwo)); // 输出: [ 1, 2, 3 ]
如果不需要保留原数组,也可以直接修改传入的数组(该写法不符合标准map的实现规范,会改变原始输入数组,仅做参考):
function map (array, callback) { for (let i = 0; i < array.length; i ++) { array[i] = callback(array[i]) } return array }
内容的提问来源于stack exchange,提问作者Winslow
相关产品推荐
相关产品推荐

