如何在JavaScript中对数组分组并统计重复组合?
解决JavaScript数组分组统计问题
问题分析
你之前的代码问题在于,把数组元素(如['Jack', 'A'])直接作为对象的键,JavaScript会自动将其转换为字符串(比如"Jack,A"),虽然能统计每个组合的次数,但得到的是扁平的统计结果,没办法按姓名分组展示每个等级的数量。
解决方案
我们可以用嵌套对象来实现分层统计:外层对象以姓名为键,内层对象以等级为键存储对应数量。
实现代码1(forEach版本)
var array = [ ['Jack', 'A'], ['Jack', 'A'], ['Sara', 'A'], ['Jack', 'B'], ['Peter', 'B'], ['Sara', 'C'], ['Sara', 'B'], ['Sara', 'A'], ['Sara', 'B'], ['Peter', 'B'], ['Peter', 'A'], ['Peter', 'C'] ]; const counts = {}; array.forEach(([name, grade]) => { // 若当前姓名未在统计对象中,初始化空对象 if (!counts[name]) { counts[name] = {}; } // 累加对应等级的数量 counts[name][grade] = (counts[name][grade] || 0) + 1; }); // 遍历统计结果,输出目标格式 for (const name in counts) { for (const grade in counts[name]) { console.log(`${name}: ${grade} : ${counts[name][grade]}`); } }
实现代码2(reduce版本,更简洁)
var array = [ ['Jack', 'A'], ['Jack', 'A'], ['Sara', 'A'], ['Jack', 'B'], ['Peter', 'B'], ['Sara', 'C'], ['Sara', 'B'], ['Sara', 'A'], ['Sara', 'B'], ['Peter', 'B'], ['Peter', 'A'], ['Peter', 'C'] ]; const counts = array.reduce((acc, [name, grade]) => { // 初始化姓名对应的对象(不存在则创建) acc[name] = acc[name] || {}; // 累加等级数量 acc[name][grade] = (acc[name][grade] || 0) + 1; return acc; }, {}); // 输出目标格式 for (const name in counts) { for (const grade in counts[name]) { console.log(`${name}: ${grade} : ${counts[name][grade]}`); } }
输出结果
运行上述代码后,控制台会输出你需要的格式:
Jack: A : 2 Jack: B : 1 Sara: A : 2 Sara: B : 2 Sara: C : 1 Peter: A : 1 Peter: B : 2 Peter: C : 1
内容的提问来源于stack exchange,提问作者gadss
相关产品推荐
相关产品推荐

