JavaScript数组按ISO-8601日期条件归约的实现疑问
问题:按日期分组事件的特殊需求是否可行?
我有一个包含ISO-8601格式日期和事件类型字符串的事件数组:
[ {date: "2023-01-11T18:00:00+00:00", type: "Meeting"}, {date: "2023-01-12T13:00:00+00:00", type: "Lunch"}, {date: "2023-01-12T13:00:00+00:00", type: "Meeting"}, {date: "2023-01-13T09:00:00+00:00", type: "Phonecall"}, {date: "2023-01-13T09:00:00+00:00", type: "Breakfast"}, {date: "2023-01-13T09:00:00+00:00", type: "Meeting"} ]
我用下面的脚本按ISO-8601日期对事件分组:
events.reduce((time, event) => { const date = event.date; if (!time[date]) { time[date] = []; } time[date].push(event); return time; }, {});
这段代码能正常运行,但我想加个条件:仅当同一ISO-8601日期对应的事件数量超过2个时才进行分组,期望输出如下:
2023-01-11T18:00:00+00:00: 0: {date: "2023-01-11T18:00:00+00:00", type: "Meeting"} 2023-01-12T13:00:00+00:00: 0: {date: "2023-01-12T13:00:00+00:00", type: "Lunch"} 2023-01-12T13:00:00+00:00: 0: {date: "2023-01-12T13:00:00+00:00", type: "Meeting"} 2023-01-13T09:00:00+00:00: 0: {date: "2023-01-13T09:00:00+00:00", type: "Phonecall"} 1: {date: "2023-01-13T09:00:00+00:00", type: "Breakfast"} 2: {date: "2023-01-13T09:00:00+00:00", type: "Meeting"}
我觉得因为对象的键不能重复,这种需求没法实现,请问我的想法对吗?
解答
你的想法不完全对——如果非要用纯对象来输出,确实没法重复键,但可以换一种数据结构实现你的需求:
方案:用数组存储分组结果
先完成常规的分组统计,再把分组结果转换成数组:当某日期的事件数>2时,把整个组作为一项放进数组;当事件数≤2时,把每个事件单独作为一项(每项包含日期和对应的单个事件)。
实现代码如下:
// 第一步:先完成常规分组 const grouped = events.reduce((time, event) => { const date = event.date; if (!time[date]) { time[date] = []; } time[date].push(event); return time; }, {}); // 第二步:转换为符合需求的结构 const result = []; for (const [date, eventsList] of Object.entries(grouped)) { if (eventsList.length > 2) { result.push({ [date]: eventsList }); } else { eventsList.forEach(event => { result.push({ [date]: [event] }); }); } }
输出成目标文本格式
如果需要打印成你展示的文本样式,可遍历result数组输出:
result.forEach(item => { const [date, events] = Object.entries(item)[0]; console.log(`${date}:`); events.forEach((event, index) => { console.log(`${index}:`, event); }); console.log(); });
这样就能得到你想要的输出效果。
内容的提问来源于stack exchange,提问作者TenB
相关产品推荐
相关产品推荐

