Array.prototype.reduce() 是 JavaScript 数组的一个高阶函数,用于将数组元素归并为单个值。以下是简单易懂的介绍:
1. 基本语法
array.reduce(callback(accumulator, currentValue, index, array), initialValue)
| 参数 | 说明 |
|---|---|
accumulator |
累加器(累积结果) |
currentValue |
当前处理的数组元素 |
index |
当前元素索引(可选) |
array |
原数组(可选) |
initialValue |
初始值(可选) |
2. 最简单的例子:数组求和
const numbers = [1, 2, 3, 4, 5];
// 传统循环写法
let sum = 0;
for (let num of numbers) {
sum += num;
}
console.log(sum); // 15
// reduce 写法(一行搞定)
const sum = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(sum); // 15
3. 执行过程分解
const numbers = [1, 2, 3];
const sum = numbers.reduce((acc, curr) => {
console.log(`acc: ${acc}, curr: ${curr}`);
return acc + curr;
}, 0);
// 执行过程:
// 第1次: acc=0, curr=1 → 返回 0+1=1
// 第2次: acc=1, curr=2 → 返回 1+2=3
// 第3次: acc=3, curr=3 → 返回 3+3=6
// 最终结果: 6
4. 常见应用场景
(1) 数组 → 对象
const fruits = ['apple', 'banana', 'apple', 'orange'];
// 统计水果出现次数
const count = fruits.reduce((acc, fruit) => {
acc[fruit] = (acc[fruit] || 0) + 1;
return acc;
}, {});
console.log(count); // { apple: 2, banana: 1, orange: 1 }
(2) 数组 → 新数组
const numbers = [1, 2, 3, 4, 5];
// 筛选偶数并平方
const result = numbers.reduce((acc, num) => {
if (num % 2 === 0) {
acc.push(num * num);
}
return acc;
}, []);
console.log(result); // [4, 16]
(3) 对象数组 → 最大值
const products = [
{ name: 'A', price: 100 },
{ name: 'B', price: 200 },
{ name: 'C', price: 50 }
];
// 找最贵的产品
const expensive = products.reduce((max, product) =>
product.price > max.price ? product : max
);
console.log(expensive); // { name: 'B', price: 200 }
5. 初始值的重要性
有初始值
[1, 2, 3].reduce((acc, curr) => acc + curr, 0);
// 执行: 0+1=1 → 1+2=3 → 3+3=6
// 结果: 6
无初始值(使用第一个元素作为初始值)
[1, 2, 3].reduce((acc, curr) => acc + curr);
// 执行: 1+2=3 → 3+3=6
// 结果: 6
⚠️ 注意:空数组无初始值会报错:
[].reduce((acc, curr) => acc + curr); // ❌ 报错
[].reduce((acc, curr) => acc + curr, 0); // ✅ 返回 0
6. 在 Vue 中的实用示例
<template>
<div>
<p>总价: {{ totalPrice }}</p>
<p>最贵商品: {{ mostExpensive.name }} ({{ mostExpensive.price }}元)</p>
</div>
</template>
<script>
export default {
data() {
return {
cartItems: [
{ name: '手机', price: 2999, quantity: 1 },
{ name: '耳机', price: 399, quantity: 2 }
]
};
},
computed: {
totalPrice() {
return this.cartItems.reduce((sum, item) =>
sum + item.price * item.quantity, 0
);
},
mostExpensive() {
return this.cartItems.reduce((max, item) =>
item.price > max.price ? item : max
);
}
}
};
</script>
7. 与其他数组方法对比
| 方法 | 返回值 | 用途 |
|---|---|---|
map() |
新数组 | 转换每个元素 |
filter() |
新数组 | 筛选符合条件的元素 |
reduce() |
任意类型 | 将数组归并为单个值 |
// 链式调用示例
const result = [1, 2, 3, 4, 5]
.filter(n => n % 2 === 0) // [2, 4]
.map(n => n * 2) // [4, 8]
.reduce((sum, n) => sum + n, 0); // 12
总结
- 核心功能:将数组归并(reduce)为单个值
- 优势:替代复杂循环,代码更简洁
- 适用场景:求和、统计、分组、找最值等聚合操作
- 记忆技巧:想象成”压缩”数组为一个结果
reduce() 是函数式编程的重要工具,掌握后能大幅提升代码简洁性和可读性!
