如何从events事件列表中按升序提取每年的唯一月份?
提取事件列表中唯一的年-月映射并排序
问题描述
我有一个名为events的事件列表,其中每个事件对象包含日期属性。我需要从中提取所有唯一的年份与对应月份,并按升序排列,期望得到如下结果:
unique = { "2023": [ "January", "October" ], "2024": [ "March" ] }
我的输入数组如下:
events = [ { "eventid": 6, "name": "Event 1", "description": "This is the first event.", "date": "10.10.2023", "status": "XO" }, { "eventid": 8, "name": "Event 2", "description": "This is another event", "date": "14.01.2023", "status": "XO" }, { "eventid": 8, "name": "Event 3", "description": "This is the last event", "date": "14.03.2024", "status": "OS" } ]
解决方案
以下是实现需求的JavaScript代码,包含日期解析、去重和排序逻辑:
// 定义月份全称与数字的映射 const monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; const unique = {}; // 遍历事件数组,提取并存储年月信息 events.forEach(event => { // 分割日期字符串:格式为 dd.mm.yyyy const [_, monthStr, year] = event.date.split('.'); // 将数字月份转换为英文全称(注意月份是0索引,需减1) const monthName = monthNames[parseInt(monthStr, 10) - 1]; // 初始化年份对应的数组 if (!unique[year]) { unique[year] = []; } // 仅添加未存在的月份,保证唯一性 if (!unique[year].includes(monthName)) { unique[year].push(monthName); } }); // 对年份升序排序,同时对每个年份下的月份按自然顺序排序 const sortedResult = Object.fromEntries( Object.entries(unique) // 按年份数字升序排列 .sort(([yearA], [yearB]) => parseInt(yearA) - parseInt(yearB)) // 对每个年份的月份数组按月份顺序排序 .map(([year, months]) => [ year, months.sort((a, b) => monthNames.indexOf(a) - monthNames.indexOf(b)) ]) ); console.log(sortedResult);
逻辑说明
- 月份映射:通过
monthNames数组将数字月份(如01)转换为对应的英文全称。 - 遍历与去重:遍历每个事件,解析日期后将月份添加到对应年份的数组中,通过
includes确保月份不重复。 - 排序处理:
- 将对象转为键值对数组后,按年份数字进行升序排序。
- 对每个年份下的月份数组,依据
monthNames中的索引排序,保证月份按自然时间顺序排列。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

