
本文介绍一种简洁高效的方法,通过遍历对象属性并累加计数,将原始对象中所有值的出现次数汇总为一个新的键值对对象(如将 `{1:'a', 2:'b', 3:'a'}` 转换为 `{a:2, b:1}`)。
在实际开发中,我们常需分析数据分布,例如统计用户选择的标签、接口返回的状态码频次或表单提交的选项分布。当数据以对象形式存储(键为 ID、值为类别)时,手动统计每个值的出现次数既繁琐又易错。此时,一个通用的频次统计函数便尤为实用。
以下是一个健壮、可复用的实现:
function countOccurrences(obj) {
const result = {};
for (const key in obj) {
// 确保只处理对象自身属性(避免原型链干扰)
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const value = obj[key];
// 将 value 转为字符串以支持任意类型(如数字、布尔值、null),如需严格类型区分可移除此步
const keyForCount = String(value);
result[keyForCount] = (result[keyForCount] || 0) + 1;
}
}
return result;
}使用示例:
const obj1 = {
1: 'a',
2: 'b',
3: 'a',
4: 'c',
5: 'a',
6: 'd',
7: 'c'
};
const output = countOccurrences(obj1);
console.log(output); // { a: 3, b: 1, c: 2, d: 1 }✅ 关键说明:
立即学习“Java免费学习笔记(深入)”;
- 使用 hasOwnProperty 防止意外遍历原型属性;
- String(value) 确保数值 1 和字符串 '1' 在默认场景下统一计数(若需区分类型,可改用 JSON.stringify(value) 或自定义键生成逻辑);
- 该方法时间复杂度为 O(n),空间复杂度为 O(k)(k 为不同值的数量),性能优异;
- 不依赖外部库,兼容所有现代浏览器及 Node.js 环境。
? 进阶提示:若需支持 undefined、null 或 Symbol 类型值,建议先做类型校验并显式转换(例如 value == null ? 'null' : typeof value === 'symbol' ? value.toString() : String(value)),以确保键的唯一性与可读性。
掌握这一模式,你不仅能快速解决值频次统计问题,还能将其轻松扩展至数组、Map 或异步数据流场景。










