一.前言
最近在面试,一直有被问到在工作中使用到的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!!!