FE-Interview icon indicating copy to clipboard operation
FE-Interview copied to clipboard

Day226:用 reduce 实现 map 方法

Open Genzhen opened this issue 4 years ago • 1 comments

每日一题会在下午四点在交流群集中讨论,五点小程序中更新答案 欢迎大家在下方发表自己的优质见解 二维码加载失败可点击 小程序二维码

扫描下方二维码,收藏关注,及时获取答案以及详细解析,同时可解锁800+道前端面试题。


reduce & map

reduce 是一个累加方法,是对数组累积执行回调函数,返回最终计算的结果。

array.reduce(function (total, currentValue, currentIndex, arr) {},
initialValue);
  • total 必需:初始值,或者计算结束后返回的值
  • curentValue 必需:当前元素
  • currentIndex 可选:当前元素的索引
  • arr 可选,当前元素的所属的数组对象
  • initialValue 可选:传给函数的初始值

map 是遍历数组的每一项,并执行回调函数的操作,返回一个对每一项进行操作后的新数组。

array.map(function (crrentValue, index, arr) {}, thisArg);
  • currentValue 必需:当前元素只

  • index 可选:当前元素索引值

  • arr 可选:当前元素所属数组对象

  • thisArg 可选:对象作为该执行回调时使用,传递给函数,用作 "this" 的值。如果省略了 thisArg,或者传入 null、undefined,那么回调函数的 this 为全局对象。

  • 参考实现

Array.prototype.myMap = function (fn, thisArg = []) {
  if(typeof fn !== function){
      throw new Error(`${fn} is not a function`);
  }
return this.reduce((pre, cur, index, arr) => {
    return pre.concat(fn.call(thisArg, cur, index, arr));
  }, []);
};
var arr = [2, 3, 1, 5];
arr.myMap(function (item, index, arr) {
  console.log(item, index, arr);
});
let res = arr.myMap((v) => v * 2);
console.log(res); // [4,6,2,10]

Genzhen avatar Jan 22 '21 04:01 Genzhen

return this.reduce((pre, cur, index, arr) => {
    return pre.concat(fn.call(thisArg, cur, index, arr));
  }, []);;

这样会不会更好呢

chensiguo avatar Jan 23 '21 16:01 chensiguo