手写数组的 filter map reduce 方法

时间:2020-7-29 作者:admin
  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 地址 github.com/hegegetells…

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。