JavaScript中如何获取数组内各分类的最新日期
问题描述
我有一个包含Customer对象的数组,每个对象包含ID、category和date属性,同一分类下可能存在不同的日期。原始数据示例:
Customer 1 | qualityCheck | 12.03.2022 Customer 1 | priceCheck | 05.07.2021 Customer 1 | customerCheck| 25.10.2022 Customer 1 | qualityCheck | 19.09.2020 Customer 1 | priceCheck | 15.05.2022
需要获取每个分类的最新日期,返回包含目标项的新列表,期望结果如下:
Customer 1 | qualityCheck | 12.03.2022 Customer 1 | customerCheck| 25.10.2022 Customer 1 | priceCheck | 15.05.2022
数组条目可能有100条甚至仅1条,该如何实现?
解决方案
以JavaScript为例,可通过分组比较的方式实现,步骤如下:
- 先将
dd.mm.yyyy格式的日期字符串转换为可直接比较的Date对象,避免字符串比较的误差; - 用临时对象按
ID+category的组合作为唯一键,存储每个分组下的最新日期对象; - 遍历原始数组,逐一比较并更新临时对象中的最新项;
- 将临时对象的值转换为数组,得到最终结果。
完整代码示例:
// 原始Customer数组 const customers = [ { ID: 'Customer 1', category: 'qualityCheck', date: '12.03.2022' }, { ID: 'Customer 1', category: 'priceCheck', date: '05.07.2021' }, { ID: 'Customer 1', category: 'customerCheck', date: '25.10.2022' }, { ID: 'Customer 1', category: 'qualityCheck', date: '19.09.2020' }, { ID: 'Customer 1', category: 'priceCheck', date: '15.05.2022' } ]; // 转换dd.mm.yyyy为Date对象的辅助函数 function parseDate(dateStr) { const [day, month, year] = dateStr.split('.'); return new Date(year, month - 1, day); // 月份在Date中是0基索引,需减1 } // 分组存储最新项 const latestEntries = {}; customers.forEach(item => { // 生成唯一键:区分不同客户+不同分类 const key = `${item.ID}-${item.category}`; const currentDate = parseDate(item.date); // 如果当前分组不存在,或当前项日期更新,则替换 if (!latestEntries[key] || currentDate > parseDate(latestEntries[key].date)) { latestEntries[key] = { ...item }; // 浅拷贝原对象,避免引用修改 } }); // 转换为结果数组 const result = Object.values(latestEntries); // 输出结果 console.log(result);
说明
- 该逻辑支持任意数量的数组条目(包括1条);
- 如果存在多个不同
ID的客户,也能正确按「客户+分类」分组,保留每个分组的最新日期项; - 日期转换确保了比较的准确性,避免了直接比较字符串导致的错误(比如
01.12.2023和10.01.2022的字符串比较结果不符合实际日期顺序)。
内容的提问来源于stack exchange,提问作者sulox32
相关产品推荐
相关产品推荐

