如何返回reduce统计年份出现次数后出现次数最多的年份?求学习资源推荐
用reduce统计年份频次后获取出现次数最多的年份对应对象
假设你手上是一组带年份属性的对象数组,比如:
const data = [ { year: 2020, name: 'Alice' }, { year: 2020, name: 'Bob' }, { year: 2021, name: 'Charlie' }, { year: 2020, name: 'Dave' }, { year: 2022, name: 'Eve' } ];
第一步:用reduce完成统计
先通过reduce生成一个统计结构,记录每个年份的出现次数和对应的所有对象:
const yearStats = data.reduce((acc, item) => { const key = item.year; if (!acc[key]) { acc[key] = { count: 0, items: [] }; } acc[key].count++; acc[key].items.push(item); return acc; }, {});
这里yearStats的结构会是:
{ "2020": { count: 3, items: [/* 三个2020年的对象 */] }, "2021": { count: 1, items: [/* 2021年的对象 */] }, "2022": { count: 1, items: [/* 2022年的对象 */] } }
第二步:找出频次最高的年份对应对象
接下来从统计结果里筛选出次数最多的项,有两种常用方式:
方式1:forEach遍历
let maxCount = 0; let mostFrequentItems = []; Object.values(yearStats).forEach(stat => { if (stat.count > maxCount) { maxCount = stat.count; mostFrequentItems = stat.items; } }); // 输出所有频次最高的年份对象 console.log(mostFrequentItems); // 如果只需要单个对象,取mostFrequentItems[0]即可
方式2:reduce直接筛选
const topStat = Object.values(yearStats).reduce((prev, curr) => { return curr.count > prev.count ? curr : prev; }, Object.values(yearStats)[0]); // 初始化第一个统计项 console.log(topStat.items); // 频次最高的年份对应的所有对象
如果有多个年份出现次数相同且都是最大值,上面的代码会返回第一个遇到的年份。如果需要返回所有最大值对应的对象,可以稍作修改:
const maxCount = Math.max(...Object.values(yearStats).map(s => s.count)); const allTopItems = Object.values(yearStats) .filter(stat => stat.count === maxCount) .flatMap(stat => stat.items); console.log(allTopItems); // 所有频次最高的年份对象
逻辑与代码思路学习资源推荐
书籍
- 《JavaScript高级程序设计》:覆盖JS核心语法、DOM、异步编程等内容,帮你构建扎实的基础体系,理解各类功能实现逻辑
- 《你不知道的JavaScript》:分三卷深入讲解JS的原型链、闭包、异步等底层机制,纠正常见认知误区,提升对语言本质的理解
- 《算法图解》:用图文结合的方式讲解常见算法和数据结构,降低学习门槛,培养逻辑思维
- 《代码整洁之道》:学习如何写出清晰、可维护的代码,规范编码习惯,优化代码思路
网站
- Stack Overflow:遇到问题直接搜索,查看全球开发者的解决方案和讨论,学习不同场景下的代码实现思路
- MDN Web Docs:JS官方权威文档,包含详细的API说明、示例代码和最佳实践,是日常开发的必备参考
- LeetCode:通过刷题练习算法和数据结构,锻炼逻辑思维和问题解决能力,积累各类编程技巧
- freeCodeCamp:提供免费的全栈开发课程,从基础到进阶,结合实战项目提升代码能力
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

