端午节三天的假期,因为没有带电脑回家所以无聊的时候就只能通过手机翻翻文档,于是,意外的发现,reduce真的太强大了。
在此之前,我一直只是简简单单的把reduce用于求和,但其实他还有很多有意思的用法。
例如,实现Promise的顺序执行,例如有多个Ajax请求,后一个请求依赖于前一个请求的结果(现在也可以用await async实现),这时候就必须保证只有前一个请求完成才能进行下一个请求。代码如下:
实现Promise的顺序执行
function runPromiseInSequence(promisearr){
return promisearr.reduce((promiseChain,current) =>promiseChain.then(current),Promise.resolve(),
Promise.resolve())
}
const p1 = () => new Promise((resolve,reject) =>{
setTimeout(() =>{
console.log('p1');
resolve()
},1000)
})
const p2 = () => new Promise((resolve,reject) =>{
setTimeout(() =>{
console.log('p2');
resolve()
},1000)
})
const p3 = () => new Promise((resolve,reject) =>{
setTimeout(() =>{
console.log('p3');
resolve()
},1000)
})
const p4 = () => new Promise((resolve,reject) =>{
setTimeout(() =>{
console.log('p4');
resolve()
},1000)
})
runPromiseInSequence([p1,p2,p3,p4])
还有用await实现的;
async function runPromiseInSequence(arr){
for(let i = 0;i<arr.length;i++){
await arr[i]()
}
}
数组对象取最大年龄
var list = [
{name: '小明', age: 18},
{name: '小红', age: 19},
{name: '小李', age: 20}
]
在这里的话好像reduce没看出多大的优势。
通过sort进行排序
list.sort((a,b) => a.age-b.age)
一开始能想到的做法
function Maxby(arr,params){
let valuearr = arr.map(item => item[params]);
let max = Math.max(...valuearr);
const index = valuearr.findIndex(item => item===max)
return arr[index]
}
console.log(Maxby(list,'age'));
通过reduce解决(感觉并没有多大的用处,还变得更复杂了。。)
function groupby(arr,params){
return arr.reduce((pre,now) =>{
let key = now[params];
if(!pre[key]) pre[key] = [];
pre[key].push(now)
return pre
},{})
}
console.log(groupby(list,'age'));
统计字符出现的次数
var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
let a = names.reduce((total,now) => {
if(!total[now]) total[now]=1;
else total[now]++
return total
},{})
console.log(a);