JavaScript实现统计各leader空dateExit值数量并存储到数组
解法与优化建议
核心思路
用一个对象作为中间统计容器,遍历数据时记录每位leaderDisplay对应的dateExit === ""的次数,最后将对象的键、值分别提取为目标数组。这种方式仅需遍历一次原始数据,效率更高,逻辑也更简洁。
基础实现代码
// 假设你的原始数据集结构如下 const rawData = [ { leaderDisplay: 'Albert Owens', dateExit: '' }, { leaderDisplay: 'Albert Owens', dateExit: '' }, { leaderDisplay: 'Tina Snow', dateExit: '' }, { leaderDisplay: 'Rick Sanchez', dateExit: '' }, { leaderDisplay: 'Rick Sanchez', dateExit: '' }, { leaderDisplay: 'Rick Sanchez', dateExit: '2023-10-01' } // 此条不满足条件,不会被统计 ]; // 初始化统计容器 const leaderCountMap = {}; // 遍历统计 rawData.forEach(item => { if (item.dateExit === "") { // 存在则计数+1,不存在则初始化为1 leaderCountMap[item.leaderDisplay] = (leaderCountMap[item.leaderDisplay] || 0) + 1; } }); // 生成目标数组 const leaderNames = Object.keys(leaderCountMap); const emptyExitCounts = Object.values(leaderCountMap); console.log(leaderNames); // 输出: ['Albert Owens','Tina Snow','Rick Sanchez'] console.log(emptyExitCounts); // 输出: [2,1,2]
简化优化(使用reduce)
可以用数组的reduce方法将遍历和统计合并,代码更紧凑:
const leaderCountMap = rawData.reduce((acc, item) => { if (item.dateExit === "") { acc[item.leaderDisplay] = (acc[item.leaderDisplay] || 0) + 1; } return acc; }, {}); // 后续生成数组的代码和上面一致 const leaderNames = Object.keys(leaderCountMap); const emptyExitCounts = Object.values(leaderCountMap);
优势说明
- 时间复杂度为
O(n):仅遍历一次原始数据,比多次筛选、分组的方式更高效 - 逻辑清晰:用对象做映射,直接对应leader和计数,无额外复杂判断
- 代码简洁:避免冗余的中间数组操作,降低出错概率
内容的提问来源于stack exchange,提问作者abolEnt
相关产品推荐
相关产品推荐

