怎么样才算吃透一个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,之后如果碰见更好的解法,再和大家分享!有如不对的地方,欢迎批评交流!