谈谈我对手写JS数组API的通性思考

怎么样才算吃透一个API呢,个人觉得至少还得能够快速手写出其实现的源码。数组里面的API很多也很好用。下面来介绍几个常用的而且功能强大的API(至于到底有多少种用法,本篇不细讲)。

1.map(fn,thisArg),对数组进行遍历操作返回新数组

Array.prototype.mymap=function(fn,toThis){          
    let result=[]
    let arr=toThis?toThis:this  //map函数可以指定this
    for(let i=0;i<arr.length;i++){
        let temp=fn.call(arr,arr[i],i,arr)  //map方法接受三个参数
        result.push(temp)
    }
    return result
}
const arr=[1,2,3,4]             //测试
console.log(arr.mymap(x=>x*2))

 2.reduce(fn(pre,cur,index,arr),init)用于数组的累加计算,返回最终结果。

Array.prototype.myreduce=function(fn,init){          
    let arr=this
    let result=init?init:arr[0]         //如果有初始值,那么一开始就是result=init
    for(let i=init?0:1;i<arr.length;i++){
        result=fn(result,arr[i],i,arr)  //将result的值计算完之后返回
    }
    return result
}
const arr=[1,2,3,4]             //测试
console.log(arr.myreduce((pre,cur)=>pre+cur,1))

 3.filter(fn),用于过滤数组的某些选项,返回一个新的数组

Array.prototype.myfilter=function (fn){
    let result=[]
    let arr=this
    for(let item of arr){
        if(fn(item)){
            result.push(item)
        }
    }
    return result
}

const arr=[1,2,3,4]                //测试
console.log(arr.myfilter(x=>x>2))

4.数组的flat方法,用于拍平一个数组,将多维数组转为一维数组。

function myflat(arr){          
    const isDeep=arr.some(item=>item instanceof Array)
    if(!isDeep){                      //递归结束条件
        return arr
    }
    const res=Array.prototype.concat.apply([],arr)
    return myflat(res)
}
const arr=[1,[2,[3,[4]]]]             //测试
console.log(myflat(arr))

 其实手写数组方法可以有很多,但是推荐只用一套自己容易理解的方式。我的“三板斧”就是弄清楚数组接受的参数,再细化该API的功能,一步一步迭代实现。主要要注意,在写显示原型链上的方法的时候,要注意this对象的获取。

当然还有很多其他的API,之后如果碰见更好的解法,再和大家分享!有如不对的地方,欢迎批评交流!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值