JS-掌握 JS 数组遍历:从 forEach 到 reduce 的全方位指南

30 阅读3分钟

前言

在现代 JavaScript 开发中,函数式编程思想越来越普及。掌握数组的各种遍历方法,不仅能让你的代码更简洁(告别传统的 for 循环),还能显著提升代码的可读性和可维护性。

一、 基础遍历与映射

1. forEach():纯粹的遍历

  • 作用:依次遍历数组子项。
  • 返回值:始终为 undefined
  • 注意:无法在中途使用 breakcontinue 跳出循环。

2. map():加工与映射

  • 作用:对数组每一项执行操作,并返回一个新数组
  • 特点:原数组不变,新数组长度与原数组一致。

JavaScript

const arr = [1, 2, 3];
const newArr = arr.map((item, index) => item + index); 
// [1, 3, 5]

二、 过滤与查找

1. filter():条件的筛选

  • 作用:返回所有符合条件的成员组成的新数组。
  • 注意:回调函数应返回一个 Boolean 值。

JavaScript

const arr = [1, 2, 3, 4, 5];
const filtered = arr.filter(item => item > 4); // [5]

2. find() & findIndex():精准定位

  • find() :寻找并返回第一个满足条件的成员。找不到则返回 undefined
  • findIndex() :同上,但返回的是该成员的下标。找不到则返回 -1

三、 逻辑判断:some() 与 every()

这两个方法就像数组的“逻辑开关”,返回布尔值。

  • some() :只要有一个元素满足条件,就返回 true(一真即真)。
  • every() :必须所有元素都满足条件,才返回 true(一假即假)。

JavaScript

const arr = [1, 2, 3];
console.log(arr.some(item => item === 3));  // true
console.log(arr.every(item => item === 3)); // false

四、 终极武器:reduce() 累加器

reduce 是功能最强大的遍历方法,它能将数组“折叠”成一个单一的值(数字、对象、甚至新数组)。

1. 语法参数

reduce((sum, cur, index, arr) => { ... }, initialValue)

  • initialValue(可选) :建议始终提供初始值。如果不提供,sum 默认取数组第一项,遍历从索引 1 开始;若数组为空且无初始值,会报错。

2. 实战演练

const arr = [1, 2, 3, 4, 5];
const total = arr.reduce((sum, item) => sum + item, 10000);
console.log(total); // 10015

五、 面试模拟题(高频考点)

Q1:forEach、map、filter 的区别是什么?

参考回答:

  • forEach:用于执行副作用(如打印、修改外部变量),无返回值。

  • map:用于对原数据进行加工,返回等长的新数组。

  • filter:用于数据清洗,返回符合条件的新数组(长度可能变短)。

    它们三者都不会改变原数组。

Q2:在一个非常大的数组中寻找一个特定元素,find 和 filter 哪个性能更好?

参考回答:

find 性能更好。因为 find 在找到第一个匹配项后就会停止遍历(短路效应),而 filter 必须遍历完整个数组来找出所有符合条件的项。

Q3:如果 reduce 没有提供初始值 initialValue,会发生什么?

参考回答:

  • 如果数组不为空:accumulator(累加器)将取数组的第一个元素,currentValue 将取第二个元素,遍历从索引 1 开始。
  • 如果数组为空:直接抛出 TypeError。为了代码健壮性,通常建议手动设置初始值。

六、 总结表

方法返回值是否改变原数组场景
forEachundefined简单遍历
map新数组数据加工
filter新数组数据筛选
some/everyBoolean条件校验
find成员值查找单个值
reduce累加结果数据聚合/折叠