JavaScript 数组
创建、索引与遍历数组,以及核心的 map、filter、reduce 方法。
你将学到
- 创建数组并按索引访问元素
- length 属性与常用变更方法(push、pop、shift、unshift)
- 函数式遍历:map、filter、reduce、forEach
- 用 find、some、every、includes 查找与判断
- 展开语法(...)与数组解构
概念讲解
什么是数组?
数组是值的有序、索引列表。在 JavaScript 中,数组是一种特殊的对象,其键是数字索引。
const fruits = ["apple", "banana", "cherry"];
console.log(fruits[0]); // "apple" ← 从 0 开始
console.log(fruits.length); // 3
添加与删除元素
const stack = [];
stack.push("a"); // 添加到末尾 → ["a"]
stack.push("b"); // ["a", "b"]
stack.pop(); // 从末尾移除 → ["a"]
const queue = [1, 2, 3];
queue.shift(); // 从头部移除 → [2, 3]
queue.unshift(0); // 添加到头部 → [0, 2, 3]
三大方法:map、filter、reduce
这些函数式方法是现代 JavaScript 数据处理的核心。它们不会修改原数组。
map——将每个元素转换为新数组,长度不变。filter——只保留通过测试的元素。reduce——将所有元素累积为单个值。
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map((n) => n * 2);
// [2, 4, 6, 8, 10]
const evens = numbers.filter((n) => n % 2 === 0);
// [2, 4]
const total = numbers.reduce((sum, n) => sum + n, 0);
// 15
查找与判断
const users = [
{ name: "Ada", age: 36 },
{ name: "Alan", age: 41 },
];
users.find((u) => u.name === "Ada"); // { name: "Ada", age: 36 }
users.some((u) => u.age > 40); // true — 至少一个
users.every((u) => u.age > 30); // true — 全部满足
[1, 2, 3].includes(2); // true
展开与解构
const a = [1, 2];
const b = [3, 4];
const combined = [...a, ...b]; // [1, 2, 3, 4]
const [first, second] = [10, 20]; // first=10, second=20
展开运算符 ... 也是复制数组而不修改原数组的标准方式:const copy = [...original];。
示例代码
const products = [
{ name: "Laptop", price: 999, inStock: true },
{ name: "Phone", price: 699, inStock: true },
{ name: "Tablet", price: 399, inStock: false },
{ name: "Monitor", price: 249, inStock: true },
];
// filter:只保留有库存的商品
const available = products.filter((p) => p.inStock);
// map:只提取名称
const names = available.map((p) => p.name);
console.log("Available:", names);
// reduce:有库存商品的总价
const totalValue = available.reduce((sum, p) => sum + p.price, 0);
console.log("Total inventory value:", totalValue);
// find:第一个超过 $500 的商品
const premium = products.find((p) => p.price > 500);
console.log("First premium item:", premium.name);
// 用展开不可变地添加新商品
const withNew = [...products, { name: "Keyboard", price: 79, inStock: true }];
console.log("Count after adding:", withNew.length);
这个真实示例过滤有库存商品、映射为名称、归约为总价、查找第一个高端商品,并用展开不可变地添加新商品。
动手试一试
- JSON Formatter
对象数组是常见的 API 响应——格式化并检查它们。
- CSV to JSON
把 CSV 数据转成 JavaScript 对象数组。
常见错误
错误写法
用经典 for 循环时出现差一错误
正确做法
数组从 0 开始索引,最后一个元素在 length - 1。优先使用 for...of 或函数式方法(map、filter),它们完全避免了手动索引。
错误写法
本想复制数组却修改了原数组
正确做法
push、sort、splice 等方法会就地修改。需要保留原数组时使用展开([...arr])或非变更替代方法(如 toSorted(),ES2023)。
相关资源
相关工具
- JSON to CSV
把 JavaScript 风格的对象数组转成 CSV。
相关代码片段
- Array Map / Filter / Reduce
函数式数组方法的完整参考与示例。
练习 JavaScript 数组
2 个练习
查阅不认识的术语
新手友好的术语表用大白话解释编程术语——变量、函数、DOM、Promise 等等。
动手做项目
通过引导式项目应用所学,含起始代码与解决方案。
解读错误信息
用大白话解释常见错误——什么意思、为什么发生、如何修复。