发布于 2026-01-06 0 阅读
0

reduce() 函数不好吗?DEV 全球项目展示挑战赛,由 Mux 主办:快来展示你的项目吧!

reduce() 函数不好吗?

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

几个月前,我写了一篇博文,介绍了 JavaScript .reduce() 方法的奇妙之处。在那篇文章中,我表达了自己对这个强大方法的喜爱,而我之前一直对它敬而远之。

但上周,我偶然看到 Chrome Developers YouTube 频道发布的一段视频(链接如下),这段视频挑战了我对此的看法.reduce()

reduce() 函数不好吗?

不!依我拙见,这简直是划时代的伟大发明。它不仅可以用于.reduce()……简化,还可以用于映射和过滤。你可以用它.reduce()来保持数组高度,交叉引用多个数组,扁平化数组等等!

怎么会reduce()不好呢?

正如那句老话所说——能做并不代表应该做。所以我看了那个视频。两分钟后,我就明白了视频开头提出的问题是什么意思。

虽然.reduce()这是一种非常强大的方法,但它并不总是那么容易理解或一目了然。事实上,在回顾我一些最高效的.reduce()函数时,我花了一点时间才弄明白其中的一些逻辑。

正如 Jake 在视频中解释的那样,“最简单的代码是按顺序编写的”。但是 reduce 方法的编写方式却很特殊,并非按时间顺序。它的语法.reduce()是:

array.reduce((accumulator, currentValue, currentIndex, array), initialValue)
Enter fullscreen mode Exit fullscreen mode

要了解以下方法的执行方式,您需要从末尾开始获取初始值,然后回溯到函数中的运算符,最后查看累加器以预测结果。

const reduce = (arr) => {
 return arr.reduce((accumulator, currentValue, currentIndex, array) => {
    return accumulator + currentValue
  }, 10)
}

reduce([10,23,5]) // result = 48
Enter fullscreen mode Exit fullscreen mode

何时应该这样做.reduce()

你应该使用 reduce 来进行真正的归约操作,也就是说,你要将一个数组归约成一个值。这个值应该保存在累加器中。

何时不应使用.reduce()
如果您不确定何时.reduce()应该使用或不应该使用,请问问自己——您想要实现的行为是否可以通过使用以下方式实现:

  1. 地图
  2. 筛选
  3. 环形

对于特定任务而言,这可能.reduce()是更优雅的解决方案。在这种情况下,也要问问自己——reduce 操作是让我的代码更易读还是更难读?

讨论:

给定三个数组,要求返回这三个数组中都存在的数字。查看下面的代码片段,你会使用.reduce()哪种方法?或者是否有更好的解决方案?

let arr1 = [8,5, 12,90,65,1,0,768,8,4]
let arr2 = [34,3,0,45,23,67,1,5, 15, 67,09]
let arr3 = [10,23,5]

const intersection = (input) => {
    return input.reduce((acc, arr) => {
    return acc.filter(num => arr.indexOf(num)!==-1)
  })
}

console.log(intersection([arr1, arr2, arr3])) // result = [5]
Enter fullscreen mode Exit fullscreen mode

请观看我之前提到的Chrome开发者视频

另外,还可以看看可汗学院工程团队的这篇博客文章。Josh Comeau 在文中提供了一些关于如何使用.reduce().

文章来源:https://dev.to/jasterix/is-reduce-bad-2hhd