本文介绍如何将键为数字索引的对象按指定属性(如 name)分组,统计各值出现次数,并重构为带序号索引的新对象,适用于去重+计数场景。
本文介绍如何将键为数字索引的对象按指定属性(如 name)分组,统计各值出现次数,并重构为带序号索引的新对象,适用于去重+计数场景。
在 JavaScript 中,原始数据常以类数组对象形式存在(如键为连续数字字符串的普通对象),而非真正的数组。若需基于某字段(例如 Name)进行频次统计并生成有序结果对象,关键在于:先聚合计数,再转换为带递增索引的新结构。
以下为推荐的清晰、可读性强且兼容现代浏览器(支持空值合并操作符 ??)的实现方案:
const input = {
0: { State: true, Name: 'bob' },
1: { State: true, Name: 'candice' },
2: { State: true, Name: 'allen' },
3: { State: true, Name: 'bob' },
4: { State: true, Name: 'bob' },
5: { State: true, Name: 'candice' }
};
// 步骤1:遍历所有值,按 Name 累计频次
const countMap = {};
for (const { Name } of Object.values(input)) {
countMap[Name] = (countMap[Name] ?? 0) + 1;
}
// 步骤2:将 Map 转为带序号索引的对象
const result = {};
Object.entries(countMap).forEach(([Name, Count], index) => {
result[index] = { Name, Count };
});
console.log(result);
// 输出:
// {
// 0: { Name: 'bob', Count: 3 },
// 1: { Name: 'candice', Count: 2 },
// 2: { Name: 'allen', Count: 1 }
// }✅ 优势说明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 使用 Object.values() 直接提取值,避免手动处理数字键;
- 利用 ?? 运算符安全初始化计数,比 || 更严谨(可正确处理 0 等 falsy 值);
- Object.entries() + forEach 保证输出顺序与统计顺序一致(ES2015+ 中对象属性遍历顺序遵循插入顺序);
- 无需依赖外部库,纯原生 JS 实现。
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 若原始对象键非数字字符串(如 'a', 'id-1'),该逻辑仍适用,因 Object.values() 不依赖键类型;
- 如需按 Count 降序排列,可在 Object.entries(countMap) 后添加 .sort((a, b) => b[1] - a[1]);
- 若最终需返回数组而非对象,直接使用 Object.entries(...).map(...) 即可,更符合函数式风格。
该方案兼顾可读性、健壮性与执行效率,是处理此类“扁平化+频次聚合”任务的推荐实践。

















