扎实基础篇-----reduce进阶(下)| 8月更文挑战

639 阅读3分钟

前言

上篇文章主要介绍了reduce的基本语法和经典入门例子,熟悉了之后,这篇文章主要是和小伙伴分享一下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你就可以放心使用啦。 image.png

总结

reduce方法,总而言之还是很强大的,感兴趣喜欢研究的小伙伴们可以更详细的去了解一番,相信会有不一样的收获!前端漫漫长途,我们都在路上,希望可以和大家一起交流,一起进步。持续更新ing.....