如何简洁获取JSON对象列表中最常见属性值的计数?
问题:获取JSON对象列表中某属性最常见值的计数的简洁实现方式
将给定数据示例中,最常见的"a"属性值(值为"x")的计数为2。现需获取JSON对象列表中某属性的最常见属性值的计数,请问最简洁的实现方式是什么?我原本设想可以生成不同值的计数数组(如示例中的[2, 1]),再通过Math.max(...array)获取最大值,但未能找到简洁的实现方法。
简洁实现方案
嘿,其实你思路方向完全没问题,用reduce统计计数再取最大值就是最简洁的路子,直接上代码和解释:
假设我们的JSON数组是这样的:
const data = [{a: 'x'}, {a: 'x'}, {a: 'y'}];
单行精简写法
const maxCount = Math.max(...Object.values(data.reduce((cnt, item) => (cnt[item.a] = (cnt[item.a] || 0) + 1, cnt), {})));
更易读的拆分写法
如果觉得单行太紧凑,拆开来更清晰:
// 第一步:用reduce统计每个属性值的出现次数 const countMap = data.reduce((counts, item) => { // 如果当前值还没统计过,默认给0,然后加1 counts[item.a] = (counts[item.a] || 0) + 1; return counts; }, {}); // 初始值是一个空对象用来存计数 // 第二步:提取计数数组并取最大值 const maxCount = Math.max(...Object.values(countMap));
这段代码会先得到countMap为{x: 2, y: 1},再提取值数组[2, 1],最后用Math.max拿到最大值2,完美匹配你的需求。
通用封装函数
如果需要复用在不同属性上,可以封装成一个函数:
function getMostFrequentValueCount(arr, propName) { const countMap = arr.reduce((acc, item) => { acc[item[propName]] = (acc[item[propName]] || 0) + 1; return acc; }, {}); // 处理空数组的情况,避免Math.max报错 return Object.values(countMap).length ? Math.max(...Object.values(countMap)) : 0; } // 调用示例 const data = [{a: 'x'}, {a: 'x'}, {a: 'y'}, {b: 'z'}]; console.log(getMostFrequentValueCount(data, 'a')); // 输出2 console.log(getMostFrequentValueCount(data, 'b')); // 输出1
这样不管你要统计哪个属性的最常见值计数,直接传数组和属性名就行啦。
内容的提问来源于stack exchange,提问作者MrJalapeno
相关产品推荐
相关产品推荐

