400 0867 457

NEWS/新闻

分享你我感悟

您当前位置> 主页 > 新闻 > 技术开发

如何统计 JavaScript 对象中各属性值的出现频次

发表时间:2026-01-28 00:00:00

文章作者:碧海醫心

浏览次数:

本文介绍一种简洁高效的方法,通过遍历对象属性并累加计数,将原始对象中所有值的出现次数汇总为一个新的键值对对象(如

将 `{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 }

关键说明

  • 使用 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 或异步数据流场景。

相关案例查看更多