手写JavaScript数组api(彻底弄懂数组api!)

写在前面

api会用不就行了吗?不是,有的面试官让你手撕。
傻了吧,最好的反击就是学会它然后装傻。
“之前没写过,我试试吧”,然后写出无懈可击的答案就可以了


代码的仓库地址数组的手写api

改变自身的方法

push()

向数组的末尾添加一个或更多元素,并返回新的长度。

Array.prototype.myPush=function(){
    for(let i=0;i<arguments.length;i++){
        this[this.length]=arguments[i]
    }
    return this.length
}
let arr=[1,2,3]
arr.myPush(4)
console.log(arr);

unshift()

向数组的开头添加一个或更多元素,并返回新的长度。

Array.prototype.myUnshift=function(){
    let arrLength=this.length
    let arr=this
    for(let i=arrLength+arguments.length-1;i>=0;i--){
        if(i>arguments.length-1){
            arr[i]=arr[i-arguments.length]
        }else{
            arr[i]=arguments[i]
        }
    }
    return arr.length
}
let arr=[1,2,3]
arr.myUnshift(4)
console.log(arr);

pop()

删除数组的最后一个元素并返回删除的元素。

Array.prototype.myPop=function(){
    let arr=this
    if(arr.length===0) return undefined
    let ans=arr[this.length-1]
    this.length=this.length-1
    return ans
}
let arr=[1,2,3]
let res=arr.myPop()
console.log(arr,res);

shift()

删除并返回数组的第一个元素。

Array.prototype.myShift=function(){
    let arr=this
    if(arr.length===0) return undefined
    let ans=arr[0]
    for(let i=1;i<arr.length;i++){
        arr[i-1]=arr[i]
    }
    this.length=this.length-1
    return ans
}
let arr=[1,2,3]
let ans=arr.myShift()
console.log(arr,ans);

reverse()

反转数组的元素顺序。

Array.prototype.myReverse=function(){
    let arr=this
    let arrLength=arr.length
    let copyArr=Array.from(arr)
    for(let i=0;i<arrLength;i++){
        arr[arrLength-i-1]=copyArr[i]
    }
    return arr
}
let arr=[1,2,3]
let ans=arr.myReverse()
console.log(ans);

copyWithin()

从数组的指定位置拷贝元素到数组的另一个指定位置中。

Array.prototype.myCopyWithin=function(target,start,end=this.length){
    let arr=this
    for(let i=start;i<end;i++){
        arr[target]=arr[i]
        target++;
    }
    return arr
}
let arr=['a','b','c','d','e']
arr.copyWithin(0,3,4)
console.log(arr);
arr=['a','b','c','d','e']
arr.myCopyWithin(0,3,4)
console.log(arr);
arr.myCopyWithin(1,3)
console.log(arr);

fill()

使用一个固定值来填充数组。

Array.prototype.myFill=function(value,start=0,end=this.length){
    let arr=this
    for(let i=start;i<end;i++){
        arr[i]=value
    }
    return arr
}
let arr=[1,2,3,4]
arr.myFill(0,2,4)
console.log(arr);
arr.myFill(5,1)
console.log(arr);
arr.myFill(6)
console.log(arr);

不改变自身的方法

concat()

连接两个或更多的数组,并返回结果。

Array.prototype.myConcat=function(){
    let arr=this
    for(let i=0;i<arguments.length;i++){
        for(let j=0;j<arguments[i].length;j++){
            arr[this.length]=arguments[i][j]
        }
    }
    return arr
}
let arr=['123','456']
let arr1=['1','2','3']
let arr2=['4','5','6']
let res=arr.myConcat(arr1,arr2)
console.log(arr);

slice()

选取数组的一部分,并返回一个新数组。

Array.prototype.mySlice=function(start,end=this.length){
    let arr=this
    let res=[]
    if(start<0){
        for(let i=start+end;i<end;i++){
            res.push(arr[i])
        }
    }else{
        for(let i=start;i<end;i++){
            res.push(arr[i])
        }
    }
    return res
}

let arr=[1,2,3,4,5,6]
let res=arr.mySlice(-4)
console.log(arr,res);
res=arr.mySlice(1)
console.log(res);

indexOf()

搜索数组中的元素,并返回它所在的位置。

Array.prototype.myIndexOf=function(num){
    let arr=this
    for(let i=0;i<arr.length;i++){
        if(arr[i]===num){
            return i
        }
    }
    return -1
}
let arr=[1,2,3,4,5,6]
console.log(arr.myIndexOf(5));

lastIndexOf()

搜索数组中的元素,并返回它最后出现的位置。

Array.prototype.myLastIndexOf=function(num){
    let arr=this
    for(let i=arr.length-1;i>=0;i--){
        if(arr[i]===num) return i
    }
    return -1
}

let arr=[1,2,3,4,4,4]
console.log(arr.myLastIndexOf(4));

join()

把数组的所有元素放入一个字符串。

Array.prototype.myJoin=function(separator=','){
    let arr=this
    let str=''
    for(let i=0;i<arr.length;i++){
        str+=arr[i]
        if(i!=arr.length-1){
            str+=separator
        }
    }
    return str
}

let arr=[1,2,3,4,5,6]
let res=arr.myJoin('-')
console.log(arr,res);

toString()

把数组转换为字符串,并返回结果。

Array.prototype.myToString=function(separator=','){
    let arr=this
    let str=''
    for(let i=0;i<arr.length;i++){
        str+=arr[i]
        if(i!=arr.length-1){
            str+=separator
        }
    }
    return str
}
let arr=[1,2,3,4,5,6]
let arr1=[1,2,'a','b']
res=arr1.myToString()
console.log(arr1,res);

数组的遍历方法

forEach()

数组每个元素都执行一次回调函数。

Array.prototype.myForEach=function(fn,thisArg){
    let arr=this
    for(let i=0;i<arr.length;i++){
        fn.call(thisArg,arr[i])
    }
}

let obj={
    num:10
}
let arr=[1,2,3,4,5,6]
arr.myForEach(function(value,index,arr){
    console.log(value+this.num);
},obj)
console.log(arr);

map()

通过指定函数处理数组的每个元素,并返回处理后的数组。

Array.prototype.myMap=function(fn,thisArg){
    if(Object.prototype.toString.call(fn).slice(8,-1)!=="Function"){
        throw new error("The first argument must be a function!")
    }
    let result=[]
    let currentArr=this
    for(let i=0;i<currentArr.length;i++){
        result[i]=fn.call(thisArg,currentArr[i],i,currentArr)
    }
    return result
}
// console.log(Object.prototype.toString.call(123).slice(8,-1));

arr=[1,2,3,4,5,6]
console.log(arr.map((item,index,arr)=>{
    return item*2
}));
console.log(arr.myMap((item,index,arr)=>{
    return item+1
}));

filter()

检测数值元素,并返回符合条件所有元素的数组。

Array.prototype.myFilter=function(fn){
    if(Object.prototype.toString.call(fn).slice(8,-1)!=="Function"){
        throw new error("ths first argument must be Function!")
    }
    let arr=this
    let res=[]
    for(let i=0;i<arr.length;i++){
        if(fn(arr[i],i,arr)){
            res.push(arr[i])
        }
    }
    return res
}
let arr=[1,2,3,4,5,6,7,8,9]
let res=arr.myFilter((value,index,arr)=>{
    return value>4
})
console.log(arr,res);

every()

检测数值元素的每个元素是否都符合条件。

Array.prototype.myEvery=function(fn){
    let arr=this
    let count=0
    for(let i=0;i<arr.length;i++){
        if(fn(arr[i])){
            count++
        }
    }
    if(count===arr.length){
        return true
    }else{
        return false
    }
}

let arr=[1,2,3,4,5,6,7,8]
let res=arr.myEvery(value=>{
    return value>4
})
console.log(arr,res);
res=arr.myEvery(value=>{
    return value>0
})
console.log(res);

some()

检测数组元素中是否有元素符合指定条件。

Array.prototype.mySome=function(fn){
    let arr=this
    for(let i=0;i<arr.length;i++){
        if(fn(arr[i])) return true
    }
    return false
}

let arr=[1,2,3,4,5,6]
let res=arr.mySome(value=>{
    return value>4
})
console.log(arr,res);

reduce()

将数组元素计算为一个值(从左到右)。

Array.prototype.myReduce=function(fn,initValue){
    let arr=this
    let currentIndex=arguments.length===1?1:0
    let currValue=arguments.length===1?arr[0]:initValue
    for(let i=currentIndex;i<arr.length;i++){
        currValue=fn(currValue,arr[i])
    }
    return currValue
}
let arr=[1,2,3,4,5]
let result=arr.myReduce((preval,nextval)=>{
    return preval+nextval
},1)
console.log(result);

entries()

从数组 fruit 创建一个可迭代对象, 该对象包含了数组的键值对:

Array.prototype.myEntries=function(){
    let ans=[]
    for(let i=0;i<this.length;i++){
        ans[i]=[]
        ans[i].push(i)
        ans[i].push(this[i])
    }
    return ans
}
let arr=['12313','12','545']
console.log(arr.myEntries());
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值