- 手动实现Array.prototype.map
我们都知道map() 方法返回一个新数组,且数组里面的元素都调用一个提供的函数 然后 返回结果 函数的参数是 arr[i] i arr 所以我么就有了思路
// map 方法
function map(arr,callback) {
//首先检查一下参数
let flag = !Array.isArray(arr) || !arr.length || typeof callback !=='function'
if(flag){
return []
}else{
//每次调用我们都会返回一个新数组
let newArr = []
for(let i = 0; i<arr.length;i++){
newArr[i] = callback(arr[i], i, arr)
}
return newArr
}
}
let allArr = [1,2,3,4,5]
console.log(map(allArr,(item)=>item+1))
[2, 3, 4, 5, 6]
- 手动实现 Array.prototype.filter
filter 方法也是我们返回一个新数组 但是返回的事符合既定条件的元素
那么我们这样去写
// filter // 方法
function filter(arr,callback) {
let flag = !Array.isArray(arr) || !arr.length || typeof callback !=='function'
if(flag){
return []
}else{
let newArr = []
for (let index = 0; index < arr.length; index++) {
if(callback(arr[index],index,arr)){
newArr.push(arr[index])
}
}
return newArr
}
}
console.log(filter(allArr,(item)=>item>2))
[3, 4, 5]
3.手写 Array.prototype.reduce
那么函数的reduce含义我们都知道 按顺序执行,最后结果汇总为一个值而返回 我们不要忘了它的一个初始值的处理
// reduce 方法
function reduce(arr,callback,initValue) {
let flag = !Array.isArray(arr) || !arr.length || typeof callback !=='function'
if(flag){
return []
}else{
// 判断有没有初始值
let isValue = initValue ===0?(!initValue):(!!initValue)
let reduceValue = isValue?initValue:arr[0]
// 判断其实相加的值
for (let index =isValue?0:1; index < arr.length; index++) {
reduceValue = callback(reduceValue, arr[index],index, arr)
}
return reduceValue
}
}
console.log(reduce(allArr,(x,y)=>x+y)) //15
网友评论