
本文介绍如何将包含姓名与类别组合的二维数组,按姓名和类别两级结构进行分组并统计出现频次,最终生成嵌套对象,便于后续格式化输出或数据处理。
本文介绍如何将包含姓名与类别组合的二维数组,按姓名和类别两级结构进行分组并统计出现频次,最终生成嵌套对象,便于后续格式化输出或数据处理。
在 JavaScript 中,对数组进行“重分组”(re-grouping)本质上是构建多层级聚合结构的过程。本例中,原始数据是一个二维字符串数组,每个子数组形如 ['Name', 'Category'],目标是统计每位用户(如 Jack)在每个类别(如 A、B、C)下的出现次数,并组织为清晰的嵌套结构。
核心思路是:使用一个对象作为主容器,以人名为第一级键;其值为另一个对象,以类别为第二级键,对应值为该组合的出现次数。这比简单扁平计数更结构化,也更符合实际业务场景(如用户行为分析、权限统计等)。
以下是推荐实现方式(ES5+ 兼容,逻辑清晰易维护):
function groupAndCount(arr) {
const result = {};
arr.forEach(([name, category]) => {
// 确保 name 层级存在
if (!result[name]) {
result[name] = {};
}
// 确保 category 层级存在,并累加计数
result[name][category] = (result[name][category] || 0) + 1;
});
return result;
}
// 示例调用
const array = [
['Jack', 'A'], ['Jack', 'A'], ['Sara', 'A'],
['Jack', 'B'], ['Peter', 'B'], ['Sara', 'C'],
['Sara', 'B'], ['Sara', 'A'], ['Sara', 'B'],
['Peter', 'B'], ['Peter', 'A'], ['Peter', 'C']
];
console.log(groupAndCount(array));
// 输出:
// {
// Jack: { A: 2, B: 1 },
// Sara: { A: 2, B: 2, C: 1 },
// Peter: { A: 1, B: 2, C: 1 }
// }
? 关键优化点说明:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 使用解构赋值
[name, category]提升可读性; - 利用逻辑运算符
|| 0替代冗长的if/else判断,简洁安全; - 避免直接用数组项(如
element)作对象键——原提问中counts[element]会将整个子数组转为字符串(如"Jack,A"),虽可行但丧失结构语义,不利于扩展。
如需进一步格式化为题目所列的扁平字符串列表(如 "Jack: A : 2"),可追加遍历逻辑:
const grouped = groupAndCount(array);
Object.entries(grouped).forEach(([name, categories]) => {
Object.entries(categories).forEach(([cat, count]) => {
console.log(`${name}: ${cat} : ${count}`);
});
});
✅ 注意事项:
- 输入数组需确保每项为长度 ≥ 2 的数组,否则建议增加校验(如
Array.isArray(item) && item.length >= 2); - 若需保持插入顺序或支持 Map 结构,可用
Map替代普通对象,但本例中对象已足够高效且兼容性更好; - 此方法时间复杂度为 O(n),空间复杂度为 O(k),k 为唯一
[name, category]组合数,性能优秀。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










