使用高阶函数实现Array对象的方法
Array 原型上有很多数组的方法。例如 map, every, some,filter,forEach等,今天我们就使用高阶函数来mock以上的功能。 以上方法怎么使用,就不再举例说明了,大家应该都用的滚瓜烂熟了。常用的使用模式都是这样的。
[1,2,3,4,5].forEach((item, index) => {
console.log(item)
})
那么什么是高阶函数呢?大家都知道,在JS的世界里,函数是一等公民,函数既可以做参数,也可以做函数的返回值,跟普通的变量没有区别。例如:
function add (fn) {
return fn
}
大概解释清楚概念后,我们就使用高阶函数的理念,分别通过原生的JS来实现以上数组的几种方法:
- forEach
function forEach (array, fn) {
for(let i = 0; i< array.length; i++) {
fn(array[i],i)
}
}
forEach([1,2,3,4], (item, i) => {
console.log(item)
})
- filter
function filter(array, fn) {
let _arr = []
for(let i = 0; i< array.length; i++) {
if(fn(array[i],i)) {
_arr.push(array[i])
}
}
return _arr
}
let cc = filter([2,3,4,4,5,5,6,6], (item, i) => {
return item % 2 === 0
})
console.log(cc);
- some
function some (array, fn) {
let flag = false
for(let i = 0; i< array.length; i++) {
if ((fn(array[i],i))) {
flag = true
break
}
}
return flag
}
let dd = some([1,2,4,4,4,5], (item) => {
return item > 3
})
- every
function every(array, fn) {
let flag = true
for(let i = 0; i< array.length; i++) {
if (!(fn(array[i],i))) {
flag = false
break
}
}
return flag
}
let ff = every([1,2,4,4,4,5], (item) => {
return item > 0
})
- map
function map (array, fn) {
let _arr = []
for(let i = 0; i< array.length; i++) {
_arr.push(fn(array[i], i))
}
return _arr
}
let ee = [1,2,3,4].map(item => {
return item * 2
})