JavaScript: JavaScript 数组进阶

最后更新:2026-10-13

上一课学了数组的基础操作,这课来学数组的"大招"——高阶方法。这些方法能让你用更少的代码做更多的事,是现代 JavaScript 开发的核心技能。

相关数组方法:findIndex forEach filter reduce every find some sort map

1. map — 映射

map 对数组每个元素执行函数,返回一个新数组,原数组不变。就像一条流水线:每个元素进去,加工后出来,组成新产品。

HTML
<script>
let prices = [10, 20, 30];
let doubled = prices.map(p => p * 2);   // [20, 40, 60]
</script>

map 的回调函数接收三个参数:(元素, 索引, 原数组),最常用的是第一个。


filter 筛选满足条件的元素,返回新数组,原数组不变。像安检:符合条件的放行,不符合的拦下。

HTML
<script>
let scores = [45, 80, 92, 55, 78, 98];
let passed = scores.filter(s => s >= 60);  // [80, 92, 78, 98]
</script>

回调函数返回 true 的元素保留,返回 false 的丢弃。


3. reduce — 归并

reduce 把数组"压缩"成一个值。最经典的用法是求和:

HTML
<script>
let nums = [1, 2, 3, 4, 5];
let sum = nums.reduce((acc, cur) => acc + cur, 0);  // 15
</script>

两个参数的含义:

💡 提示: reduce 一开始最难理解,但它的本质就一句话:把数组一步步"压缩"成一个值。求和、求最大值、统计次数都能用它。

▶ 示例:map、filter、reduce 组合

▶ 试一试

4. find 和 findIndex

找不到时,find 返回 undefined,findIndex 返回 -1。

HTML
<script>
let users = [
  { name: '小明', age: 20 },
  { name: '小红', age: 17 },
  { name: '小刚', age: 25 }
];

users.find(u => u.age > 22);       // { name: '小刚', age: 25 }
users.findIndex(u => u.age < 18);  // 1(小红的索引)
</script>

5. sort — 排序

sort 对数组原地排序(会改变原数组!)。默认按字符串排序,这坑了不少人:

HTML
<script>
let nums = [10, 1, 21, 2];
nums.sort();           // [1, 10, 2, 21]  ← 字符串排序!"10" < "2"

// 正确:数字排序需要传比较函数
nums.sort((a, b) => a - b);   // [1, 2, 10, 21]  ← 从小到大
nums.sort((a, b) => b - a);   // [21, 10, 2, 1]  ← 从大到小
</script>
⚠️ 注意: sort 会修改原数组!不想改原数组,先拷贝一份再排序:[...arr].sort(...)。

▶ 示例:学生成绩排序

▶ 试一试

6. some 和 every

HTML
<script>
let scores = [60, 75, 82, 90];

scores.some(s => s >= 90);    // true  有人90分以上
scores.some(s => s === 100);  // false 没人满分
scores.every(s => s >= 60);   // true  全部及格
</script>
💡 提示: some 像在问"有没有人...",every 像在问"是不是所有人都..."。一问存在,一问全部。


7. 展开运算符(...)

展开运算符 ... 可以"拆开"数组,常用于复制和合并:

HTML
<script>
let a = [1, 2, 3];
let b = [...a];          // 复制:[1, 2, 3](新数组,不是引用)
let c = [...a, 4, 5];    // 合并:[1, 2, 3, 4, 5]
let d = [0, ...a, 4];    // 插入:[0, 1, 2, 3, 4]

let x = [1, 2], y = [3, 4];
let z = [...x, ...y];    // [1, 2, 3, 4]
</script>

8. 解构赋值

从数组中提取值,按位置赋给变量:

HTML
<script>
let [a, b, c] = [1, 2, 3];
// a = 1, b = 2, c = 3

let [first, ...rest] = [1, 2, 3, 4, 5];
// first = 1, rest = [2, 3, 4, 5]

let [name, score] = ['小明', 95];
// name = '小明', score = 95
</script>
💡 提示: 解构赋值让代码更简洁。函数返回多个值时,用数组包装再解构是常见模式。


9. 链式调用

高阶方法返回新数组,所以可以链式调用——一个接一个:

HTML
<script>
let result = students
  .filter(s => s.score >= 60)     // 先过滤及格的
  .map(s => s.name)               // 再取名字
  .sort();                         // 最后排序
</script>

▶ 示例:链式调用处理数据

▶ 试一试

▶ 示例:展开运算符与解构

▶ 试一试

相关数组方法:findIndex forEach filter reduce every find some sort map

❓ 常见问题

Q map 和 forEach 有什么区别?
A map 返回新数组,forEach 返回 undefined。需要用结果就选 map,只是执行操作就选 forEach。别在 forEach 里手动 push 到外部数组——那该用 map。
Q sort 为什么会改变原数组?
A 这是历史设计。sort 采用原地排序(in-place),修改原数组而不是返回新数组。不想改原数组就先拷贝:[...arr].sort(...)。
Q reduce 的初始值可以省略吗?
A 可以,省略时以数组第一个元素作为初始值,从第二个元素开始遍历。但空数组省略初始值会报错,所以建议始终写上初始值,更安全。

📖 小节

📝 作业

  1. 给定数组 [3, 8, 12, 5, 9, 17, 4],用 filter 筛选出大于 7 的数,再用 map 将它们翻倍,输出结果
  2. 用 reduce 统计一个字符串数组中每个单词出现的次数,如 ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple'] → { apple: 3, banana: 2, cherry: 1 }
  3. 给定学生数组(含 name、score),用链式调用实现:过滤及格的学生 → 按分数降序排序 → 取出名字生成新数组,将结果显示在页面上
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏