最佳方法:将日期数组转换为带计数的唯一对象数组
将日期数组转换为含计数的唯一对象数组的最优实现
核心思路
先用**reduce**统计每个日期的出现次数(时间复杂度O(n)),再将统计结果转换为目标格式的数组,整体仅需两次线性遍历,是效率最优的实现方式之一。
示例实现(JavaScript)
原始数组
const dates = ['07Sep', '09Sep', '14Sep', '05Sep', '12Sep', '06Sep', '10Sep', '14Sep', '08Sep', '10Sep', '04Sep', '05Sep', '07Sep', '08Sep', '13Sep', '12Sep', '05Sep', '05Sep', '06Sep', '10Sep', '06Sep', '13Sep', '05Sep', '06Sep', '05Sep', '04Sep', '12Sep', '05Sep', '11Sep', '10Sep', '11Sep', '06Sep', '04Sep', '10Sep'];
实现代码
// 1. 统计每个日期的出现次数(支持统一大小写) const countMap = dates.reduce((acc, date) => { const normalizedDate = date.toUpperCase(); // 统一转大写,避免大小写差异导致的重复统计 acc[normalizedDate] = (acc[normalizedDate] || 0) + 1; return acc; }, {}); // 2. 转换为目标格式的数组 const result = Object.entries(countMap).map(([date, count]) => ({ [date]: count })); console.log(result);
输出结果示例
[ { '07SEP': 2 }, { '09SEP': 1 }, { '14SEP': 2 }, { '05SEP': 7 }, { '12SEP': 3 }, { '06SEP': 5 }, { '10SEP': 5 }, { '08SEP': 2 }, { '04SEP': 3 }, { '13SEP': 2 }, { '11SEP': 2 } ]
说明
- 如果不需要统一日期大小写,可直接移除
date.toUpperCase()步骤,使用原始字符串统计 - 整体时间复杂度为O(n),仅需遍历数组两次,在大数据量场景下性能表现最优
内容的提问来源于stack exchange,提问作者Olly
相关产品推荐
相关产品推荐

