JavaScript数组之强大的reduce

86 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

前言

作为一个前端开发每天看到 Array 类型的次数比看女朋友的次数都多😂🤣😂🤣。一年的CRUD经历让我自以为对数组的使用已经如火纯青,碰到任何要使用数组处理的问题直接上 forEachmapfilter。直到有一天网上看到实现两个数组过滤的写法,才让我知道这种想法确实只是自以为...

这是啥?

要实现的需求是这样的:若B数组中存在A数组中的值,则将A数组中的对应值过滤

数组A:[1, 2, 3, 5]
数组B:[2, 4, 5, 10, 92]
====>
res: [1, 3]
const deepFilter = (source, arr) => {
  const res = arr.reduce((pre, cur) => {
    return pre.filter((item) => cur !== item)
  }, source)
  return res;
}

???(黑人问号),这是什么写法? reduce 不是用来数组求和的吗?怎么能实现这种需求呢?(这里要感谢菜鸟教程,一个示例直接让我对 reduce 打上标签😂😂)。

一探究竟

是什么?

想搞明白reduce能做什么就想理解她是什么吧。

reduceforEachmap 类似,也是 Array 原型上的一个遍历方法。

reduce 可以接收 两个 参数,

 1、(必填)第一个参数接收一个函数,对数组中的每个元素按序执行该函数,
 每一次运行 `reduce` 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值
 2、可选,初始值,默认取第一个函数传进来的数组中的第一项
 

其中第一个参数 reducer 函数可接收 4 个参数:

1、previousValue 前一次调用 `reducer` 函数的返回值。第一次默认使用数组的第一项:arr[0],可以通过可选参数指定初始值
2、currentValue 当前处理的数组中的值,这里 `需要注意`: 如果指定了初始值,该项从arr[1]开始取,反之从arr[0]开始取
3、currentIndex 当前值的下标
4、arr 当前在遍历的原数组

了解了这些概念以后再去分析上面的写法,就不难理解了。

怎么用?

const deepFilter = (source, arr) => {
    const res = arr.reduce((pre, cur) => {
        return pre.filter((item) => cur !== item)
      }, source)
    return res;
}

const a = [1, 2, 3, 5];
const b = [2, 4, 5, 10, 92];

const res = deepFilter(a, b);

1、调用 deepFilter,此时 source 是数组a,arr 是数组b 2、使用 reduce 遍历数组b,初始值设置为数组a 3、第一次:传给 reducer 函数的 pre 参数也就是初始值 source(数组a) 4、从 source 中过滤 arr 的第一项 5、后续 pre 的值就是每一次过滤后的新数组 6、遍历。。。

总结来说就是:遍历数组 arr,用数组 source 过滤(filter) arr的每一项,最终得到新数组。

返回值

reduce 方法的返回值是 reducer 函数遍历整个arr数组后得到的结果pre。

总结

以后碰到数组相关的问题别再闭着眼睛上 forEachmap了!!!