js常见原生方法重写汇总(二)

reduce

reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。

Array.prototype._reduce = function(callback,next){
  let i,total;
  if(next){
    i = 0;
    total = next;
  }else{
    i = 1;
    total = this[0];
  }
  for(i;i<this.length;i++){
    let a = this[i];
    total = callback(total,this[i],i,this);
  }
  return total;
}
let arr  = [1,2,2,3,3,4,5];
function q(arr){
  return arr._reduce((a,b)=>{
    if(!a.includes(b)){
      a.push(b);
    }
    return a;
  },[])
}
console.log(q(arr));//[1,2,3,4,5]
map

遍历数组,执行回调函数,方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

//map
Array.prototype._map = function(callback){
  let a = [];
  for(let i=0;i<this.length;i++){
   a.push(callback(this[i],i,this));
  }
  return a;
}
let newArr = arr._map(function(val,i,array){
  return val*2;
})
console.log(newArr);//[2,4,6,8,10]
promise.all

promise.all返回的结果是一个Promise实例,传入的是一个数组,要求数组的每一项都是新的promise实例,Promise.all是等待所有数组中的实例状态都成功,它的状态才为成功,value是一个数组,存储着数组中每一个实例返回的结果,如果有一个失败,则状态为失败。

function promiseAll(promises){
  let arr = [];
  let num =0;
  return new Promise((resolve,reject)=>{
    promises.forEach((item,i)=>{
      item.then((res)=>{
        arr[i] = res;
        num++;
        num===promises.length&&resolve(arr);
      },err=>{
        reject(err+'err');
      })
    })
  })
}
let p1 = new Promise((resolve)=>{
  resolve(1);
})
let p2 = new Promise((resolve,reject)=>{
  //reject(2);
  resolve(2);
})
promiseAll([p1,p2]).then((res)=>{
  console.log(res);
},err=>{
  console.log(err);
})
//[1,2] 
//2err
Promise.race

它和all不同的是,race是赛跑,也就是数组中不管哪一个先处理完,结果就作为“race实例”的结果。

let p3 = new Promise((resolve)=>{
  setTimeout(()=>{
    resolve(1);
  },200)
  
})
let p4 = new Promise((resolve,reject)=>{
  setTimeout(()=>{
    reject(2);
  },1000)
})
function promiseRace(promises){
  return new Promise((resolve,reject)=>{
    promises.forEach(item=>{
      Promise.resolve(item).then(res=>{
        resolve(res);
      },err=>{
        reject(err);
      })
    })
  })
}

promiseRace([p3,p4]).then(res=>{
  console.log(res+'res');
},err=>{
  console.log(err+"err");
})
//1res
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容