如何统计JavaScript对象中不同键值的出现频率?
用Reducer优雅统计JavaScript对象中值的出现频率
针对你需要统计对象数组中各键对应值出现频率的需求,用Array.reduce结合Object.entries就能写出简洁优雅的实现,完全替代手动多层遍历:
实现代码
const input = [ {"a": "1", "b": "2"}, {"a": "2", "b": "2"}, {"a": "2", "b": "2", "c": "2"}, {"a": "bananas"} ]; const output = input.reduce((acc, currentObj) => { // 拆解当前对象的键值对并遍历 Object.entries(currentObj).forEach(([key, value]) => { // 初始化当前键的统计对象(如果不存在) if (!acc[key]) { acc[key] = {}; } // 更新对应值的计数:存在则加1,不存在则设为1 acc[key][value] = (acc[key][value] || 0) + 1; }); return acc; }, {}); console.log(output); // 输出结果和示例完全一致: // { // "a": {"1": 1, "2": 2, "bananas": 1}, // "b": {"2": 3}, // "c": {"2": 1} // }
代码说明
- 用
reduce作为核心容器,初始值是空对象,用来逐步构建最终的统计结果 Object.entries(currentObj)把每个对象的键值对转换成[键, 值]的数组形式,方便遍历- 对每个键值对,先确保累加器中存在该键对应的统计对象,再更新值的计数——
(acc[key][value] || 0)处理了值第一次出现时计数为0的情况
简化写法(ES2021+)
如果你的环境支持ES2021及以上,可以用空值合并赋值运算符进一步简化初始化逻辑:
const output = input.reduce((acc, currentObj) => { Object.entries(currentObj).forEach(([key, value]) => { acc[key] ??= {}; // 仅当acc[key]为undefined或null时初始化 acc[key][value] = (acc[key][value] || 0) + 1; }); return acc; }, {});
内容的提问来源于stack exchange,提问作者David Ferris
相关产品推荐
相关产品推荐

