手写数组的 filter map reduce 方法

2020-07-28  本文已影响0人  hegege
  1. 手动实现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]

  1. 手动实现 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

github 地址 https://github.com/hegegetellstory1/blog-sharing

上一篇下一篇

猜你喜欢

热点阅读