JavaScript对象数组值区间键计数统计及结果对象生成
解决JS对象数组区间统计问题
首先得指出你现有代码里的几个关键问题:
- 你在
filter里用dat[key]直接和数字比较,但dat[key]是数组里的完整对象(比如{"ruid":1,"id_frequency":5}),不是id_frequency属性值,这会导致比较逻辑完全错误,应该取dat[key].id_frequency来判断。 - 代码只处理了
0-9这一个区间,没有覆盖你需要的所有区间(10-19到90-100)。 - 没有生成要求的包含区间标识
c和计数d的对象数组,也没用到Object Map存储统计结果。
接下来咱们一步步实现符合需求的逻辑:
完整实现代码
// 测试数据集 const dat = [ { "ruid": 1, "id_frequency": 5 }, { "ruid": 2, "id_frequency": 88 }, { "ruid": 3, "id_frequency": 69 }, { "ruid": 4, "id_frequency": 28 }, { "ruid": 5, "id_frequency": 75 }, { "ruid": 6, "id_frequency": 78 }, { "ruid": 7, "id_frequency": 18 }, { "ruid": 8, "id_frequency": 90 }, { "ruid": 9, "id_frequency": 22 } ]; // 定义所有需要统计的区间,包含最小值、最大值和区间标识 const intervals = [ { min: 0, max: 9, label: '0-9' }, { min: 10, max: 19, label: '10-19' }, { min: 20, max: 29, label: '20-29' }, { min: 30, max: 39, label: '30-39' }, { min: 40, max: 49, label: '40-49' }, { min: 50, max: 59, label: '50-59' }, { min: 60, max: 69, label: '60-69' }, { min: 70, max: 79, label: '70-79' }, { min: 80, max: 89, label: '80-89' }, { min: 90, max: 100, label: '90-100' } ]; // 初始化Object Map,用来存储每个区间的计数 const freqMap = new Map(); intervals.forEach(interval => freqMap.set(interval.label, 0)); // 遍历数据集,统计每个区间的ruid数量 dat.forEach(item => { const currentFreq = item.id_frequency; // 找到当前id_frequency所属的区间 const matchedInterval = intervals.find(inter => currentFreq >= inter.min && currentFreq <= inter.max); if (matchedInterval) { // 更新Map中的计数 freqMap.set(matchedInterval.label, freqMap.get(matchedInterval.label) + 1); } }); // 生成包含区间标识c和计数d的结果数组 const resultArray = intervals.map(interval => ({ c: interval.label, d: freqMap.get(interval.label) })); // 输出结果 console.log('统计Map:', freqMap); console.log('结果数组:', resultArray);
代码说明
- 区间定义:咱们先把所有需要统计的区间提前定义好,每个区间包含最小值、最大值和显示用的标识,这样后续逻辑更清晰。
- Map初始化:先给每个区间的计数设为0,避免出现未定义的情况。
- 遍历统计:逐个读取数据集中的
id_frequency,找到对应的区间后更新Map里的计数。 - 生成结果数组:把Map里的统计结果转换成你需要的对象数组格式,每个元素包含
c(区间标识)和d(计数)。
运行结果
对于你的测试数据集,最终的resultArray会是:
[ { c: '0-9', d: 1 }, { c: '10-19', d: 1 }, { c: '20-29', d: 2 }, { c: '30-39', d: 0 }, { c: '40-49', d: 0 }, { c: '50-59', d: 0 }, { c: '60-69', d: 1 }, { c: '70-79', d: 2 }, { c: '80-89', d: 1 }, { c: '90-100', d: 1 } ]
内容的提问来源于stack exchange,提问作者rkras
相关产品推荐
相关产品推荐

