重写实现Array原型常用方法

一.前言

最近在面试,一直有被问到在工作中使用到的Es6新特性,我首先想到的就是经常在业务里对数组进行处理用的数组新方法,这篇文章让我们对这些方法进行解析,并试着去实现他们。

二.实现

下面就让我们来实现第一个常用的方法forEach()

1.forEach

1.callbackFn:为数组中每个元素执行的函数。并会丢弃它的返回值。该函数被调用时将传入以下参数:

element:数组中正在处理的当前元素

index:数组中正在处理的当前元素的索引。

array:调用了 forEach() 的数组本身

const arr = [1, 2, 3, 4];

Array.prototype.forEach1=function(callbackFn){

    for(i=0;i<this.length;i++){
        callbackFn(this[i],i,this)
    }




}


arr.forEach1((item,i,a)=>{
    console.log(item,i,a)
})

2.map

1.callbackFn:为数组中每个元素执行的函数。并会丢弃它的返回值。该函数被调用时将传入以下参数:

element:数组中正在处理的当前元素

index:数组中正在处理的当前元素的索引。

array:调用了 map() 的数组本身

2.返回值

返回一个新数组

Array.prototype.map1=function(callbackFn){
    let result=[]
    for(let i=0; i<this.length;i++){
        result.push(callbackFn(this[i],i,this))
    }
    return result
}
 const result=arr.map((item,i)=>item+i)
 console.log(result)

3.fliter

  • callbackFn

  • 为数组中的每个元素执行的函数。它应该返回一个真值以将元素保留在结果数组中,否则返回一个假值。该函数被调用时将传入以下参数:

  • element

  • 数组中当前正在处理的元素。

  • index

  • 正在处理的元素在数组中的索引。

  • array

  • 调用了 filter() 的数组本身。

2.返回值:返回给定数组的一部分的浅拷贝,其中只包括通过提供的函数实现的测试的元素。如果没有元素通过测试,则返回一个空数组。

Array.prototype.filter1=function(callbackFn){
    let results=[]
    for(let i=0;i<this.length;i++){
        if(callbackFn(this[i],i,this)){
            results.push(this[i])
        }
    }




    return results
}

 const result=arr.filter1((item,i)=>item>2)
 console.log(result)

4.every

  • callbackFn

  • 为数组中的每个元素执行的函数。它应该返回一个真值以指示元素通过测试,否则返回一个假值。该函数被调用时将传入以下参数:

    • element

      数组中当前正在处理的元素。

    • index

      正在处理的元素在数组中的索引。

    • array

      调用了 every() 的数组本身。

返回值

如果 callbackFn 为每个数组元素返回真值,则为 true。否则为 false

Array.prototype.every1=function(callbackFn){
    let result=true
for(let i =0;i<this.length;i++){

    if(!callbackFn(this[i],i,this)){
        result=false
        break

    }




}


return result

}



 const result=arr.every1((item,i)=>item>2)
 console.log(result)

5.some

  • callbackFn

  • 为数组中的每个元素执行的函数。它应该返回一个真值以指示元素通过测试,否则返回一个假值。该函数被调用时将传入以下参数:

    • element

      数组中当前正在处理的元素。

    • index

      正在处理的元素在数组中的索引。

    • array

      调用了 some() 的数组本身。

返回值

如果回调函数对数组中至少一个元素返回一个真值,则返回 true。否则返回 false

Array.prototype.some1=function(callbackFn){
    let result=false
for(let i =0;i<this.length;i++){

    if(callbackFn(this[i],i,this)){
        result=true
        break

    }




}


return result

}



 const result=arr.some1((item,i)=>item<2)
 console.log(result)

——————–划重点—————————–

reduce

使用方法:reduce()  方法对数组中的每个元素按序执行一个提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

  • callbackFn

    为数组中每个元素执行的函数。其返回值将作为下一次调用 callbackFn 时的 accumulator 参数。对于最后一次调用,返回值将作为 reduce() 的返回值。该函数被调用时将传入以下参数:

    • accumulator

      上一次调用 callbackFn 的结果。在第一次调用时,如果指定了 initialValue 则为指定的值,否则为 array[0] 的值。

    • currentValue

      当前元素的值。在第一次调用时,如果指定了 initialValue,则为 array[0] 的值,否则为 array[1]

    • currentIndex

      currentValue 在数组中的索引位置。在第一次调用时,如果指定了 initialValue 则为 0,否则为 1

    • array

      调用了 reduce() 的数组本身。

  • initialValue 可选

    第一次调用回调时初始化 accumulator 的值。如果指定了 initialValue,则 callbackFn 从数组中的第一个值作为 currentValue 开始执行。如果没有指定 initialValue,则 accumulator 初始化为数组中的第一个值,并且 callbackFn 从数组中的第二个值作为 currentValue 开始执行。在这种情况下,如果数组为空(没有第一个值可以作为 accumulator 返回),则会抛出错误。

返回值

使用“reducer”回调函数遍历整个数组后的结果。

Array.prototype.reduce=function(callbackFn,initialValue){
    let startIndex=0

    if(initialValue==undefined){
        startIndex=1
        initialValue=this[0]
    }





    for(let i=startIndex;i<this.length;i++){
        initialValue = callbackFn(this[i],initialValue,i,this)
    }
    return initialValue
}

 const result=arr.reduce((acc,cur)=>acc+cur,2)
 console.log(result)

应用场景:给定一个数组,计算数组所有元素的总和

扩展1:如果initialValue传0会怎么样

扩展2:如果initialValue传个2会怎么样

一定要自己试着去实现一下代码,这块你就懂了

最后

谢谢观看,麻烦帮忙点个赞,salute!!!

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYCihHkj' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片