reduce实现map方法,首先我们先来了解一下reduce和map:
1.reduce是一个累加方法,是对数组累积执行回调函数,返回最终计算结果。
array.reduce(function(total, currentValue, currentIndex, arr){
}, initialValue);
//total 必需。初始值, 或者计算结束后的返回值。
//currentValue 必需。当前元素
//currentIndex 可选。当前元素的索引
//arr 可选。当前元素所属的数组对象。
//initialValue可选。传递给函数的初始值
2.map是遍历数组的每一项,并执行回调函数的操作,返回一个对每一项进行操作后的新数组。
array.map(function(currentValue,index,arr), thisValue);
//currentValue 必须。当前元素的值
//index 可选。当前元素的索引值
//arr 可选。当前元素属于的数组对象
//thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。
说到map这里顺便把forEach也总结一下
3.forEach和map用法一样,也是是遍历数组的每一项,并执行回调函数的操作,不过forEachf返回值是undefined,不可以链式调用。
array.forEach(function(currentValue, index, arr), thisValue)
//currentValue 必需。当前元素
//index 可选。当前元素的索引值。
//arr 可选。当前元素所属的数组对象。
//thisValue 可选。传递给函数的值一般用 "this" 值。如果这个参数为空, "undefined" 会传递给 "this" 值
这里说一下map和forEach的区别
1.forEach()返回值是undefined,不可以链式调用。
2.map()返回一个新数组,原数组不会改变。
3.没有办法终止或者跳出forEach()循环。
进入正题,知道了map和reduce的用法,下面我们来用reduce实现map方法。
Array.prototype.myMap = function(fn,thisValue){
var res = [];
thisValue = thisValue||[];
this.reduce(function(pre,cur,index,arr){
return res.push(fn.call(thisValue,cur,index,arr));
},[]);
return res;
}
var arr = [2,3,1,5];
arr.myMap(function(item,index,arr){
console.log(item,index,arr);
})
附加一道恶心的面试题
["1", "2", "3"].map(parseInt); //结果 [1, NaN, NaN]
解释:parseInt()默认有两个参数,第二个参数是进制数。当parsrInt没有传入参数的时候,而map()中的回调函数时候,会给它传三个参数,第二个参数就是索引,所以返回NaN了。
网友评论