都2023年了,我不允许你还不会手写ES6的这些数组方法!

都2023年了,我不允许你还不会手写ES6的这些数组方法!

手写ES6数组方法不是为了应付面试,是为了锻炼自己的编程思维,理解这些API的核心。在工作中能更好的去理解使用。从底层思维出发去解决一系列问题,而不是遇到问题靠百度,靠猜,靠蒙。从而也是对自己职业生涯的一种交代。如果一味的觉得没什么意义,那这篇文章就不用往下看了!

forEach方法

写之前,咱们先了解一下forEach其特点

  • 参数一:回调函数
  • 参数二:this指向
  • 返回值:无
Array.prototype.MyForEach = function (fn{  //定义数组的原型方法
  let arr = this                             //接收数组本身
  let arg = arguments[1] || window           //设置第二个参数
  for (let i = 0; i < arr.length; i++) {
    fn.call(arg, arr[i], i, arr)
  }
};
都2023年了,我不允许你还不会手写ES6的这些数组方法!

map方法

写之前,咱们先了解一下map其特点

  • 参数一:回调函数
  • 参数二:this指向
  • 返回值:一个新数组

返回后的新数组会保留原数组的长度,不满足条件的则是undefined

Array.prototype.MyMap = function (fn{
  let arr = this
  let arg = arguments[1] || window
  let newarr = []                     //定义一个空数组
  for (let i = 0; i < arr.length; i++) {
    let copyArr = JSON.parse(JSON.stringify(arr[i]))  //循环出来的值深拷贝一份,避免影响原数组
    newarr.push(fn.call(arg, copyArr, i, arr))
  }
  return newarr   //返回数组结果
};
都2023年了,我不允许你还不会手写ES6的这些数组方法!

filter方法

写之前,咱们先了解一下filter其特点

  • 参数一:回调函数
  • 参数二:this指向
  • 返回值:一个新数组

返回后的新数组会过滤掉不满足条件的数组元素

Array.prototype.MyFilter = function (fn{
  let arr = this
  let arg = arguments[1] || window
  let newarr = []                     //定义一个空数组
  for (let i = 0; i < arr.length; i++) {
    let copyArr = JSON.parse(JSON.stringify(arr[i]))  //循环出来的值深拷贝一份,避免影响原数组
    let newfn = fn.call(arg, copyArr, i, arr)       
    newfn ? newarr.push(newfn) : ''  //这里进行一次判断,如果函数返回值为真就push

  }
  return newarr   //返回数组结果
};
都2023年了,我不允许你还不会手写ES6的这些数组方法!

every与some方法

写之前,咱们先了解一下everysome其特点

  • 参数一:回调函数
  • 参数二:this指向
  • 返回值:布尔值

every如果所有元素都通过检测返回 true,否则返回 false。some则取反!

Array.prototype.MyEvery = function (fn{
  let arr = this
  let arg = arguments[1] || window
  let isFlag = true                     //定义默认值
  for (let i = 0; i < arr.length; i++) {
    let newfn = fn.call(arg, arr[i], i, arr)
    if (!newfn) {                    //如果有一个条件不满足,就终止循环
      isFlag = false;
      break
    }
  }
  return isFlag   //返回结果
};
 
 
Array.prototype.MySome = function (fn{
  let arr = this
  let arg = arguments[1] || window
  let isFlag = false                   //定义默认值
  for (let i = 0; i < arr.length; i++) {
    let newfn = fn.call(arg, arr[i], i, arr)
    if (newfn) {                    //如果有一个条件满足,就终止循环
      isFlag = true;
      break
    }
  }
  return isFlag   //返回结果
};

reduce方法

写之前,咱们先了解一下reduce其特点

  • 参数一:回调函数
  • 参数二:初始值,计算结束后的返回值。
  • 参数三:this指向
  • 返回值:返回计算结果

这里唯一不好理解的就是第二个参数。因为它返回的是上一次迭代过后的结果值。

Array.prototype.MyReduce = function (fn,initval{
  let arr = this
  let arg = arguments[2] || window
  let newarr = []                     //定义一个空数组   
  for (let i = 0; i < arr.length; i++) {
    let copyArr = JSON.parse(JSON.stringify(arr[i]))  //循环出来的值深拷贝一份,避免影响原数组
    initval = fn.call(arg,initval,copyArr,i,arr)
  }
  return initval   //返回结果
};

以上所有常用的数组方法就写完了。怎么样,只要思路比较清晰,写起来还是挺简单的吧!其实还剩2个方法 find,findIndex 伙伴们可以根据上面的思路,自行去写一下吧

文章出自:https://juejin.cn/post/7244351125448212536

作者:阳火锅


原文始发于微信公众号(前端24):都2023年了,我不允许你还不会手写ES6的这些数组方法!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/216384.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!