开发者社区> 问答> 正文

map、filter、reduce各有什么作用?

展开
收起
前端问答 2019-11-24 19:56:01 878 0
1 条回答
写回答
取消 提交回答
  • 前端问答小助手

    map 作用是生成一个新数组,遍历原数组,将每个元素拿出来做一些变换然后放入到新的数组中。

    [1, 2, 3].map(v => v + 1) // -> [2, 3, 4]
    
    

    另外 map 的回调函数接受三个参数,分别是当前索引元素,索引,原数组

    ['1','2','3'].map(parseInt)
    
    
    • 第一轮遍历 parseInt('1', 0) -> 1
    • 第二轮遍历 parseInt('2', 1) -> NaN
    • 第三轮遍历 parseInt('3', 2) -> NaN filter 的作用也是生成一个新数组,在遍历数组的时候将返回值为 true 的元素放入新数组,我们可以利用这个函数删除一些不需要的元素
    let array = [1, 2, 4, 6]
    let newArray = array.filter(item => item !== 6)
    console.log(newArray) // [1, 2, 4]
    
    

    和 map 一样,filter 的回调函数也接受三个参数,用处也相同。

    最后我们来讲解 reduce 这块的内容,同时也是最难理解的一块内容。reduce 可以将数组中的元素通过回调函数最终转换为一个值。

    如果我们想实现一个功能将函数里的元素全部相加得到一个值,可能会这样写代码

    const arr = [1, 2, 3]
    let total = 0
    for (let i = 0; i < arr.length; i++) {
      total += arr[i]
    }
    console.log(total) //6
    
    

    但是如果我们使用 reduce 的话就可以将遍历部分的代码优化为一行代码

    const arr = [1, 2, 3]
    const sum = arr.reduce((acc, current) => acc + current, 0)
    console.log(sum)
    
    

    对于 reduce 来说,它接受两个参数,分别是回调函数和初始值,接下来我们来分解上述代码中 reduce 的过程

    • 首先初始值为 0,该值会在执行第一次回调函数时作为第一个参数传入
    • 回调函数接受四个参数,分别为累计值、当前元素、当前索引、原数组,后三者想必大家都可以明白作用,这里着重分析第一个参数
    • 在一次执行回调函数时,当前值和初始值相加得出结果 1,该结果会在第二次执行回调函数时当做第一个参数传入
    • 所以在第二次执行回调函数时,相加的值就分别是 1 和 2,以此类推,循环结束后得到结果 6

    想必通过以上的解析大家应该明白 reduce 是如何通过回调函数将所有元素最终转换为一个值的,当然 reduce 还可以实现很多功能,接下来我们就通过 reduce 来实现 map 函数

    const arr = [1, 2, 3]
    const mapArray = arr.map(value => value * 2)
    const reduceArray = arr.reduce((acc, current) => {
      acc.push(current * 2)
      return acc
    }, [])
    console.log(mapArray, reduceArray) // [2, 4, 6]
    
    

    如果你对这个实现还有困惑的话,可以根据上一步的解析步骤来分析过程。

    2019-12-17 07:23:08
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载