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
网友评论