reduce是javascript数组中将元素逐步归约为单个值的高阶方法,支持返回任意类型结果;其核心为累加器(accumulator)与当前项(currentvalue)的迭代运算,强烈建议显式传入initialvalue以避免空数组或边界错误。

reduce 是 JavaScript 数组中最强大也最易被低估的方法之一,它不只用来“求和”,而是能将数组逐步压缩成任意类型的单个值——比如对象、嵌套结构、布尔结果,甚至新数组。关键在于理解它的执行逻辑和正确设置初始值。
reduce 的基本结构与执行逻辑
语法:arr.reduce(callback, initialValue)。
callback 接收四个参数:累计器(accumulator)、当前项(currentValue)、当前索引(index)、原数组(array);实际常用前两个。
initialValue 非必需,但强烈建议显式传入——否则第一次调用时,accumulator 取数组第一个元素,currentValue 取第二个,容易在空数组或单元素数组时出错。
执行过程是“从左到右逐项折叠”:每轮把上一轮返回值作为 accumulator,与当前项运算,直到遍历结束。
实现多维度累加统计(如分组计数 + 求和)
场景:统计订单列表中每个商品的销售总数和总金额。
- 初始值设为一个空对象
{},作为分组容器 - 每次迭代检查商品 ID 是否已存在,若无则初始化 { count: 0, total: 0 }
- 更新对应商品的 count(+1)和 total(+price)
示例代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const orders = [
{ id: 'A', price: 25 },
{ id: 'B', price: 40 },
{ id: 'A', price: 30 }
];
const stats = orders.reduce((acc, order) => {
const { id, price } = order;
if (!acc[id]) acc[id] = { count: 0, total: 0 };
acc[id].count += 1;
acc[id].total += price;
return acc;
}, {});
// 结果:{ A: { count: 2, total: 55 }, B: { count: 1, total: 40 } }
构建嵌套结构或过滤后归约(如树形分类)
reduce 不仅能“压平”,还能“建树”。例如把扁平的带 parentId 的菜单项转成嵌套结构。
- 初始值是一个空数组
[],用于存放顶层节点 - 用 Map 或临时对象缓存所有节点(id → node),方便快速查找父节点
- 遍历中,若 parentId 为空,则推入顶层数组;否则挂到父节点的 children 数组下
技巧:可在 reduce 内部配合 Map 缓存引用,避免重复查找,提升性能。
替代 for 循环做条件聚合(如最大值、去重合并)
reduce 的灵活性让它能优雅替代很多传统写法:
- 找最大对象:初始值设为数组第一项,每轮比较 current.price 与 acc.price,返回较大者
- 数组去重并保持顺序:初始值为空数组 [],用 includes 判断是否已存在,不存在则 push
- 扁平化二维数组:初始值为 [],每轮用 concat 或展开语法 [...acc, ...current]
注意:这些操作虽可用其他 API(如 Math.max、Set、flat)更简洁完成,但 reduce 提供统一范式,适合逻辑耦合度高的复合归约。
掌握 reduce 的核心是明确“每一步想把什么变成什么”,然后设计好 accumulator 的形态和更新逻辑。它不是万能函数,但在数据转换链条中承担“收口”角色时,往往最清晰、最可控。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










