开始使用 ES6 数组方法 .filter()、.map() 和 .reduce() JavaScript 数组资源管理器

2025-06-10

开始使用 ES6 数组方法 .filter()、.map() 和 .reduce()

JavaScript 数组探索器

ES6 带来了许多新功能,其中就包括一些非常实用的Array函数。日常使用中最常用的函数是.filter().map.reduce()。在本文中,我将先通过示例来介绍每个函数,先介绍“旧”用法,然后再介绍这些新功能。

本文假设你了解箭头函数。如果你不知道它是什么,别担心。阅读我关于数组函数的博客文章的第一章,你应该就能理解这里发生了什么。

他们的共同点

所有这三个函数都是在 ES6(ECMAScript 2015)中引入的,并且是应用于 的Array函数。

另外,它们都被称为高阶函数。这意味着它们要么返回一个函数作为结果,要么接受其他函数作为参数。在本例中,是后者。理解这一点对于本课来说非常重要。

在内部,这些函数运行 forEach 循环,然后以某种方式将传递的函数应用于它正在迭代的数据。

。筛选()

对我来说最容易理解的是,.filter()它的作用正如它的名字——获取现有数组并返回该数组的一部分,可能会跳过某些值。或者换句话说:取出我们不想要的项目。

拥有以下年龄的人群。

const people = [
    { name: 'John', age: 32},
    { name: 'Isabelle', age: 18},
    { name: 'Steve', age: 17},
    { name: 'Winston', age: 10},
    { name: 'Agnes', age: 82}
]
Enter fullscreen mode Exit fullscreen mode

现在我们只想找到那些已成年的用户,或者换句话说,过滤掉未成年人。假设我们所在的国家/地区将18岁及以上视为成年。

如果我们不使用.filter()函数来编写此语句,它将是这样的:

let adults = []
people.forEach(person => {
    if(person.age >= 18) {
        adults.push(person)
    }
})
Enter fullscreen mode Exit fullscreen mode

使用 ES6.filter()函数 if 看起来会像这样:

const adults = people.filter(person => person.age >= 18)

// Will outout the objects for John, Isabelle and Agnes...
console.log(adults)
Enter fullscreen mode Exit fullscreen mode

让我们来分析一下...

  • 作为参数,我们传递一个函数
  • 该函数(对于此示例)采用一个参数(此处person:)
  • 该参数指的是在 filter() 的 forEach 中迭代的当前元素。
  • 我们传递的函数返回一个布尔。该布尔值表示当前元素是否被过滤掉(true= 表示保留在数组中,false= 表示被跳过)。
  • 作为此布尔值的条件,我们知道此人的年龄是否高于或等于 18 岁。

注意!为了简化这篇博文,我不会解释所有可以传递的参数。有关可选参数的更多详细信息,请参阅MDN 文档 filter()

。地图()

.map()也返回一个数组作为结果。但这次我们不会过滤任何内容,而是用根据原始数组计算出的数据填充新数组。

假设我们有一个以摄氏度为单位的数组:

const celsiusArray = [ 21.5, 33.5, -7.1, 12.6 ]
Enter fullscreen mode Exit fullscreen mode

如果我们将其转换为相同的数组,但使用华氏度,我们可以按照传统方式进行操作:

let fahrenheitArray = []
celsiusArray.forEach(celsius => {
    fahrenheitArray.push((celsius * 9/5) + 32)
})
Enter fullscreen mode Exit fullscreen mode

如果我们想使用 写同样的东西.map(),它看起来会像这样:

const fahrenheitArray = celsiusArray.map(celsius => (celsius * 9/5) + 32)
Enter fullscreen mode Exit fullscreen mode

请注意,与.filter()示例不同,当我们使用该函数时,原始数组和输出数组的数组大小始终相同.map()

让我们分析一下这里发生了什么……

  • 作为参数,我们传递一个函数
  • 该函数(对于此示例)采用一个参数(此处celsius:)
  • 该参数指的是在 filter() 的 forEach 中迭代的当前元素。
  • 我们传递的函数返回我们想要的任何类型的值
  • 该值就是将插入到新数组中的值。

注意!为了简化这篇博文,我不会解释所有可以传递的参数。有关可选参数的更多详细信息,请参阅MDN 文档 map()

。减少()

此函数是三个函数中唯一一个不返回数组的函数。相反,它返回单个值。

这意味着,函数使用数组中的信息并进行计算。计算结果完全取决于我们传入的函数。

假设餐厅里消费的产品有以下几种:

const foodOrder = [
    { name: 'Pizza Diavola', price: 15.9 },
    { name: 'Sparkling Water', price: 2.9 },
    { name: 'Tiramisu', price: 6.5 }
]
Enter fullscreen mode Exit fullscreen mode

如果我们想计算顾客票据上显示的食品总额(包括 17% 的增值税),如果我们不知道 .reduce() 函数,我们会执行以下操作:

let sum = 0
foodOrder.forEach(food => {
    sum += food.price
})
Enter fullscreen mode Exit fullscreen mode

.reduce()看起来是这样的:

const total = foodOrder.reduce(( accumulator, food ) => accumulator + food.price, 0);
Enter fullscreen mode Exit fullscreen mode

请注意,除非像其他两个函数一样,.reduce()否则不会返回数组,而是返回单个值。

那么上面的例子中发生了什么?

  • .reduce()遍历我们的数组,并对每个食物项调用我们的函数
  • 第一项accumulator是循环到目前为止计算出的当前“总”值
  • food是当前正在迭代的项目
  • 我们传递的函数的返回值我们想要做的任何计算,使用accumulatorcurrentValue(在本例中将两者相加)
  • 只有一个小问题:大多数情况下,这种计算必须有一个初始值。幸运的是,ES6 为我们提供了一个可选参数(.reduce()函数中的第二个参数)。

注意!为了简化本文,我不会解释所有可以传递的参数。有关可选参数的更多详细信息,请参阅MDN 文档中关于 reduce() 的内容

鏂囩珷鏉ユ簮锛�https://dev.to/themarcba/get-started-with-the-es6-array-methods-filter-map-and-reduce-35hm
PREV
构建 Tailwind CSS 按钮组件 + 变体
NEXT
🧠 新的 React 和旧的缓存 Rapscallion electro-react-ssr-caching 安装使用 React 服务器端渲染优化库 React 组件缓存 React 预渲染组件