如何用JavaScript统计JSON对象数组指定字段的最高频次值
最高频字段统计实现方案
整个计算过程可以做到O(n)时间复杂度,单次遍历完成所有统计,没有冗余循环,常规业务数据量下毫秒级就能出结果,完全满足高效简洁的要求。
实现思路
核心逻辑是边遍历边计数、边更新最大值,不需要先把所有值的数量存完再二次遍历找最大值:
- 针对要统计的字段,维护一个计数表,记录每个值的出现次数
- 每遍历到一条日志,就给对应值的计数加1
- 如果当前值的计数超过已经记录的最大计数,就直接更新最终结果,不用等全部遍历完再回头比对
- 自动跳过字段缺失的异常数据;如果出现多个值计数相同的情况,默认返回最先出现的值,符合常规业务的预期
可直接复用的代码实现
/** * 统计数组中指定字段的最高频值 * @param {Array} arr 待统计的对象数组 * @param {String} field 需要统计的字段名 * @returns {*} 出现频次最高的字段值 */ function getMostFrequent(arr, field) { const countMap = {}; let maxValue = null; let maxCount = 0; for (const item of arr) { const currentValue = item[field]; // 跳过字段不存在的异常数据 if (currentValue === undefined) continue; // 更新当前值的出现次数 countMap[currentValue] = (countMap[currentValue] || 0) + 1; // 实时更新最高频结果,省去后续遍历计数表的开销 if (countMap[currentValue] > maxCount) { maxCount = countMap[currentValue]; maxValue = currentValue; } } return maxValue; } // 业务调用示例 const userBehaviorLogs = [/* 替换为你提供的那组日志数据 */]; const maxCategory = getMostFrequent(userBehaviorLogs, 'category'); const maxProduct = getMostFrequent(userBehaviorLogs, 'product');
用你给出的示例数据运行后,输出结果和预期完全一致:
maxCategory值为 "Motor Insurance"maxProduct值为 "Car Insurance"
方案的高效性来源
- 没有冗余循环:相比“先全量统计所有值的计数、再二次遍历计数表找最大值”的写法,这个方案在同一次遍历里就完成了最大值判定,比常规写法少了一轮全量扫描
- 复用性强:不需要为category、product两个字段各写一套统计逻辑,同一个函数可以适配任意字段的最高频统计需求
- 内存占用低:计数表的大小和数组中去重后的字段值数量一致,不会额外占用不必要的内存
内容的提问来源于stack exchange,提问作者Prateek Joshi
相关产品推荐
相关产品推荐

