前言
上篇文章主要介绍了reduce的基本语法和经典入门例子,熟悉了之后,这篇文章主要是和小伙伴分享一下reduce在我们实际开发中有哪些妙用?
正文
执行为什么输出的是 NaN
一起来回顾上一节留下的疑问,下边代码片段执行为什么输出的是 NaN ?
var maxCallback = ( acc, cur ) => Math.max( acc.x, cur.x );
[ { x: 2 }, { x: 22 }, { x: 42 } ].reduce( maxCallback );
解析思路:首先在调用reduce方法时,我们并没有传入默认值,这时候默认值就被解析成了一个空对象(我个人理解哈),然后一个空对象调用属性,就是undefined;接着**Math.max(undefined,1)**就会返回NaN。不知道小伙伴们是怎么理解的,可以留言在评论区一起探讨~ 好啦,言归正传,那接下来我们就继续来学习reduce吧!
实现数组去重
let arr = [{"all": 1}, {"all": 2}, {"all": 3}, {"all": 4}, {"all": 1}];
let hash = {};
arr = arr.reduce((item,next)=>{
hash[next.all] ? "" : hash[next.all] = true && item.push(next);
return item;
},[]);
console.log(arr);
我们在处理这样的对象数组时,使用reduce的方式就相比于使用filter等遍历的方法,是不是看起来就很有效率。
多维数组转化成一维数组
let arr = [[0,1,3],[2,3],[4],5,6,7,[9,10,11]];
const newArr = function(arr){
return arr.reduce((pre,cur) => pre.concat(Array.isArray(cur) ? newArr(cur) : cur),[])
}
console.log(newArr(arr));
到这里,我们不难发现,reduce函数就是把第一个参数callback封装为一个数组,由数组中的每一个函数单独进行叠加并完成reduce操作。所有的一切通过一个manager函数来管理流程和传递初始参数。
按顺序运行Promise
我们在开发中可能会碰到要多个异步组合的场景,可能会选用promis.then进行链式调用,当需要好多函数链式执行用.then回调处理就很不优雅,这时可以试试选用reduce函数来实现。这是引用的MDN上的一个代码片段,感觉很清晰的实现了一个链式调用,小伙伴们可以多看几遍,理解理解,一起来学习一下。
function runPromiseInsquence(arr, input) {
return arr.reduce(
(promiseChain, currentFunction) => promiseChain.then(currentFunction),
Promise.resolve(input)
)
}
// function 1
function p1(a) {
return new Promise((resolve, reject) => {
resolve(a * 5);
});
}
// function 2
function p2(a) {
return new Promise((resolve, reject) => {
resolve(a * 2);
})
}
// function 3
function p3(a) {
return new Promise((resolve, reject) => {
resolve(a * 3);
})
}
// function 4
function p4(a) {
return new Promise((resolve, reject) => {
resolve(a * 4);
})
}
const promiseArr = [p1, p2, p3, p4];
runPromiseInsquence(promiseArr, 10).then();
这段代码我们需要明白的是,其实这种reduce写法,就是我们熟悉的Promise().then().then().then()的写法, 只不过使用reduce代码更简洁了,我们需要注意的是reduce()的数组是一个Function的数组,而不是Promise的数组。另外,reduce()方法的第二个参数,它是一个初始值,在这里就是Promise.resolve(),它表示一个动作已经执行完成,可以进行下一个动作了。
究竟兼容性如何
这里我查阅了一下官方数据,介绍的很详细,我们在选择使用时,一定要考虑兼容性,当然如果你的项目可以引入babel你就可以放心使用啦。
总结
reduce方法,总而言之还是很强大的,感兴趣喜欢研究的小伙伴们可以更详细的去了解一番,相信会有不一样的收获!前端漫漫长途,我们都在路上,希望可以和大家一起交流,一起进步。持续更新ing.....