reduce替代for/while累加,通过回调参数维护状态,避免手动声明变量;支持基础累加、对象数组聚合、条件累加、嵌套结构扁平化,简洁且函数式。

用 reduce 替代传统 for 或 while 循环做累加,核心在于把“状态维护”交给回调函数的参数,避免手动声明和更新累加变量。它更简洁、不可变、函数式风格强,尤其适合数组聚合场景。
基础累加:从 sum 到 reduce
比如计算数组所有数字之和:
传统写法需要显式定义变量并循环更新:
let sum = 0;for (let i = 0; i sum += arr[i];
}
用 reduce 一行搞定:
其中 acc(accumulator)是累计值,curr(current)是当前项,0 是初始值——这一步就替代了 let sum = 0 和循环体内的 sum += ...。
处理对象数组:按字段聚合
常见需求:统计订单列表中总金额、某类商品数量、平均单价等。
例如,求所有订单的总支付金额:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
{ id: 1, amount: 99.9 },
{ id: 2, amount: 150.5 },
{ id: 3, amount: 45.0 }
];
const total = orders.reduce((sum, order) => sum + order.amount, 0); // 295.4
如果还要同时算笔数和最高金额,可以累积一个对象:
const stats = orders.reduce((acc, order) => ({count: acc.count + 1,
total: acc.total + order.amount,
max: Math.max(acc.max, order.amount)
}), { count: 0, total: 0, max: -Infinity });
条件累加:跳过或过滤后再合并
不是所有元素都要参与计算?在回调里加判断即可,无需提前 filter(节省一次遍历):
- 只累加正数:
arr.reduce((s, n) => n > 0 ? s + n : s, 0) - 累加偶数索引项:
arr.reduce((s, n, i) => i % 2 === 0 ? s + n : s, 0) - 排除空值/undefined:
arr.reduce((s, n) => n != null ? s + n : s, 0)
注意:不推荐在 reduce 里做副作用(如 push 到外部数组),那会破坏纯函数特性;真要生成新数组,请用 map + reduce 组合,或直接用 flatMap。
嵌套结构扁平累加:多层数据一键归总
遇到树形、分组或二维结构时,reduce 配合展开操作符或递归,比多层 for 更清晰:
例:统计多级分类下所有商品价格总和:
const categories = [{ name: '手机', items: [{ price: 3999 }, { price: 5299 }] },
{ name: '配件', items: [{ price: 89 }, { price: 299 }] }
];
const total = categories.reduce(
(sum, cat) => sum + cat.items.reduce((s, item) => s + item.price, 0),
0
); // 9686
这种“reduce 套 reduce”模式,天然适配层级聚合,逻辑直白,不易出错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










