用 reduce 统计数组频次需以空对象或 Map 为初始值,遍历中用 acc[item] = (acc[item] || 0) + 1 或 map.set(item, (map.get(item) || 0) + 1) 累加,注意返回累加器、避免隐式类型转换、空数组必须传初始值。

用 reduce 统计数组元素频次,核心是把空对象作为初始值,遍历中累加每个元素的计数。
基本写法:用空对象做累加器
每次遍历时,检查当前元素是否已在累加器对象中存在,存在就 +1,不存在就设为 1。
- 初始值传入一个空对象
{} - 回调函数接收两个参数:累加器
acc和当前项item - 用
acc[item] = (acc[item] || 0) + 1安全累加
示例:
const arr = ['a', 'b', 'a', 'c', 'b', 'a'];
const count = arr.reduce((acc, item) => {
acc[item] = (acc[item] || 0) + 1;
return acc;
}, {});
// { a: 3, b: 2, c: 1 }
处理非字符串类型(如数字、布尔值、null)
JavaScript 对象键会自动转为字符串,所以 1 和 '1' 会被视为同一键。多数场景没问题,但若需严格区分类型,可改用 Map。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 数字
1、字符串'1'、布尔true都能当 key,但会隐式转换 - 若要保留原始类型(比如区分
null和'null'),建议用Map代替普通对象
进阶:用 Map 实现类型安全统计
Map 支持任意类型作键,避免类型隐式转换问题。
- 初始值传
new Map() - 用
map.get(item)取当前计数,map.set(item, newValue)更新 - 最后可用
Object.fromEntries(map)转成普通对象(可选)
示例:
const arr = [1, '1', true, null, 1];
const countMap = arr.reduce((map, item) => {
const count = map.get(item) || 0;
map.set(item, count + 1);
return map;
}, new Map());
// Map(4) { 1 => 2, '1' => 1, true => 1, null => 1 }
常见坑与注意事项
- 别忘了写
return acc—— 箭头函数单行不写花括号时会自动返回,但多行必须显式 return - 不要在 reduce 里直接修改原数组或外部变量,保持纯函数风格
- 空数组调用 reduce 且没提供初始值会报错,所以统计频次务必传初始值(
{}或new Map())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










