何时使用哪个数组函数?为每个现有条目返回一个新条目:map() 返回仅包含部分现有条目的新数组:filter() 仅返回一个新条目:reduce() 对每个数组值执行某些操作但不返回任何内容:forEach() 最终说明

2025-06-04

何时使用哪个数组函数?

为每个现有条目返回一个新条目:map()

返回仅包含部分现有条目的新数组:filter()

仅返回一个新事物:reduce()

对每个数组值执行某些操作但不返回任何内容:forEach()

最后说明

有时候,人们会大声喧哗,说“你应该多用 reduce”,或者“你不需要 filter,用 map 就行”,或者“For?为什么不用 forEach?”

事实是,数组及其所有迭代器函数可能会让初学者感到困惑,所以我将尝试通过从最后提出问题来为每个人简化事情:您想要得到什么?

简短版本

  • 为每个现有事物返回一个事物:map()
  • 仅返回一些现有的事物:filter()
  • 仅返回一个新事物:reduce()
  • 不返回任何东西,但对每个现有的东西做一些事情:forEach()

我将为您简要介绍一下每一个,然后使用较旧的非箭头函数语法以及较新的箭头函数语法提供示例。

为每个现有条目返回一个新条目:map()

如果你有一个数组,并且想对数组中的每个元素进行一些操作,并返回一个包含新值的新数组,那么这个方法map()就很适合你。这里有一个简单的函数,它接受一个数组,并将每个元素的值翻倍:

const originalArray = [1, 2, 3];
const newArray = originalArray.map(function(item) {
  return item * 2;
});
console.log(newArray); // -> [2, 4, 6]
Enter fullscreen mode Exit fullscreen mode

使用较新的语法可以实现相同的效果:

const originalArray = [1, 2, 3];
const newArray = originalArray.map(item => item * 2);
console.log(newArray); // -> [2, 4, 6]
Enter fullscreen mode Exit fullscreen mode

请注意,使用较新的箭头语法,我们无需使用 function 关键字、return 关键字或花括号。这是因为箭头函数为像这样的“简单”函数提供了隐式返回。您可以在此处阅读Wes Bos 撰写的有关箭头函数的更多信息。

返回仅包含部分现有条目的新数组:filter()

Filter 可能是最容易理解的数组函数,因为它的名字很贴切。Filter 接受一个数组值,对每个值执行函数或比较,然后返回一个新数组,其中包含通过测试的值(我们称之为“真值”)。

下面是一个示例,它接受一个数字数组并返回大于 5 的数字:

const originalArray = [1, 9, 4, 2, 42];
const newArray = originalArray.filter(function(item) {
  return item > 5;
});
console.log(newArray); // -> [9, 42]
Enter fullscreen mode Exit fullscreen mode

这是带有箭头函数的过滤器部分:

const newArray = originalArray.filter(item => item > 5);
Enter fullscreen mode Exit fullscreen mode

仅返回一个新事物:reduce()

有时你有一个数组,只想从中返回一个新值。Reduce 会接受一个数组,对每个值执行函数或比较,然后对所谓的“累加器”执行一些操作。这是一个更容易用例子来描述的函数,因为描述它的术语和函数本身一样令人困惑!

假设您有一个名称数组,并且想要计算名称“Bob”出现的次数:

const originalArray = ["Alice", "Bob", "Charlie", "Bob", "Bob", "Charlie"];
const numberOfBobs = originalArray.reduce(function(accumulator, item) {
  if (item === "Bob") {
    return accumulator + 1;
  } else {
    return accumulator;
  }
}, 0);
console.log(numberOfBobs); // -> 3
Enter fullscreen mode Exit fullscreen mode

再次用箭头表示:

const numberOfBobs = originalArray.reduce((accumulator, item) => {
  if (item === "Bob") {
    return accumulator + 1;
  } else {
    return accumulator;
  }
}, 0);
Enter fullscreen mode Exit fullscreen mode

如您所见,箭头函数这次并没有为我们节省太多的输入,因为我们必须向函数提供两个参数,然后在返回之前有逻辑,所以我们仍然需要花括号。

Reduce 函数末尾的 0 是累加器初始值,如果遇到的值为“Bob”,则加 1;否则,返回当前的累加器值。如果没有返回任何值,那么下次运行该函数时,累加器的值将为undefined

对每个数组值执行某些操作但不返回任何内容:forEach()

有时你会想对一个数组中的值进行一些操作,但又不需要跟踪每次函数调用的返回值。这就是它forEach()的用途。

const originalArray = [1, 2, 3];
originalArray.forEach(function(item) {
  doSomething(item);
});
Enter fullscreen mode Exit fullscreen mode

再次用箭头表示:

originalArray.forEach( item => doSomething(item); );
Enter fullscreen mode Exit fullscreen mode

最后说明

简单又实用。以下是我为每个函数想出的最简单的用例,旨在尽可能让你轻松理解何时应该使用它们。这些函数可以完成大量任务,而且每个函数都有一个“高级”形式,可以显示当前索引:

arr.map((item, index) => {})
arr.filter((item, index) => {})
arr.reduce((accumulator, item, index) => {})
arr.forEach((item, index) => {})
Enter fullscreen mode Exit fullscreen mode

如果你需要它,就使用它!

文章来源:https://dev.to/andrew565/which-array-function-when
PREV
2022 年成为开发人员的 8 个 GitHub 资源
NEXT
使用 Zsh + Tmux + Dracula 主题资源设置终端