最清晰高效的方式是用 Map 按标准化日期字符串(如 YYYY-MM-DD)分组,自动初始化数组值,再按时间戳倒序转为有序数组;需先统一日期格式并截去时间与时区。

直接用 Map 做分组容器,再转成数组,是最清晰、高效且不易出错的方式。关键不在“怎么写”,而在“怎么设计键”和“怎么处理日期一致性”。
用日期字符串作 Map 的 key
确保所有记录的日期字段统一格式(如 YYYY-MM-DD),避免 "2026-5-11" 和 "2026-05-11" 被当成两个不同日期。建议在分组前先标准化:
- JavaScript:用
new Date(item.date).toISOString().split('T')[0] - PHP:用
date('Y-m-d', strtotime($item['date'])) - Java:用
LocalDate.parse(item.getDate()).toString()
遍历中动态构建分组数组
Map 的 value 类型设为数组,每次遇到同一天的记录,就 push 进对应 key 的数组里:
- 不需预先检查 key 是否存在 —— 利用
map.get(key) || []或map.computeIfAbsent(key, k -> new ArrayList())自动初始化 - 避免覆盖:不要每次赋值
map.set(key, [item]),而是map.get(key).push(item) - 示例(TS):
const group = map.get(date) ?? []; group.push(item); map.set(date, group);
转成有序数组并保持最新优先
Map 本身不保证顺序,所以分组完成后必须显式排序:
- 把 Map 的 entries 转成数组:
Array.from(map.entries()) - 按日期字符串倒序排(推荐转时间戳比较,防字符串比对出错):
.sort((a, b) => new Date(b[0]).getTime() - new Date(a[0]).getTime()) - 最终结构是:
[{ date: '2026-05-11', items: [...] }, { date: '2026-05-10', items: [...] }]
额外注意点
如果原始数据含时区或时间部分(如 "2026-05-11T09:23:00+08:00"),务必先截取日期或转成本地零点再分组,否则同一自然日可能被拆成多组。
不复杂但容易忽略。

















