美文网首页
Javascript reduce详解及应用

Javascript reduce详解及应用

作者: 我是一个前端 | 来源:发表于2018-12-25 17:30 被阅读0次

    reduce

    • callback(一个在数组中每一项上调用的函数,接受四个参数:)
      previousValue(上一次调用回调函数时的返回值,或者初始值)
      currentValue(当前正在处理的数组元素)
      currentIndex(当前正在处理的数组元素下标)
      array(调用reduce()方法的数组)
    • initialValue(可选的初始值。作为第一次调用回调函数时传给previousValue的值)

    概念一搜一大把,我们聊点我遇到的和理解的,见代码

    callback
    //reduce作为累加器
            let arr = [1, 2, 3, 4, 5]
            let sum = arr.reduce((init, item, i, self) => {
                console.log(`init---${init}, item---${item}, i---${i}, self---${self}`)
                return init + item
            })
            console.log(sum) //15
    

    分别看一下回调参数 见下图


    image.png

    init默认为数组第一项,一次累加数组项,最后返回一项。
    item循环数组每一项
    i数组下标
    self当前调用reduce数组本身

    initialValue

    可选初始值,作为回调函数第一个参数的默认值,也是每次回调的返回值,见代码

           let obj = {
                '/home': {
                    meta: {
                        title: '首页'
                    },
                    component: '@/page/home'
                },
                '/question': {
                    meta: {
                        title: '问题'
                    },
                    component: '@/page/question'
                }
            }
            // 转化为数组
            let map = [{
                path: '/home',
                meta: {
                    title: '首页'
                },
                component: '@/page/home'
            }, {
                path: '/question',
                meta: {
                    title: '问题'
                },
                component: '@/page/question'
            }]
    
            let map1 = Object.keys(obj).reduce((arr, item) => {
                return (arr.push({
                    path: item,
                    ...obj[item]
                }), arr)
            }, [])
            console.log(map1)
    

    转化后效果


    image.png

    这个栗子来自vue配置路由时遇到的,当时也是优化了好几个版本。

    接下来详细解释一下

    Object.keys(obj) //把obj转化为内容为key的数组
    
    reduce((arr,item)=>{
    })
    //上边已经解释过参数了,回调后边的参数[]:返回值默认值是一个空数组
    
    关于 
            return (arr.push({
                    path: item,
                    ...obj[item]
                }), arr)
    
    其实可以写成
           arr.push({
                    path: item,
                    ...obj[item]
                })
            return arr
    
          
    
    具体请查看:javascript逗号操作符

    别急还有一个用法新鲜刚发现的。

      //需求:判断数组每一项的end和下一项的start是否是递增的,返回ture or false
            let arr = [{
                start: 1,
                end: 3
            }, {
                start: 1,
                end: 3
            }, {
                start: 4,
                end: 5
            }]
    
          
            function isTure(arr) {
                let status = true
                arr.reduce((pro, next) => {
                    if (pro.end >= next.start) {
                        status = false
                        return false
                    }
                    return next
                })
                return status
            }
    
            console.log(isTure(arr))
    

    这里我们巧用了 reduce的返回值,每次返回当前项,这样两个参数始终为1,2 | 2,3|3,4依次类推

    明天map和filter

    相关文章

      网友评论

          本文标题:Javascript reduce详解及应用

          本文链接:https://www.haomeiwen.com/subject/lkevkqtx.html