按名称去重并保留最新创建日期对象的实现方案
按Name去重并保留最新创建时间的对象数组
给定如下对象数组:
[ { "name":"Aaron", "status":"Pending", "createdDate":"1-1-2000" }, { "name":"Bob", "status":"Approved", "createdDate":"1-2-2000" }, { "name":"Aaron", "status":"Rejected", "createdDate":"1-3-2000" } ]
需求是按name字段去重,仅保留每个name对应createdDate最新的对象,最终期望得到:
[ { "name":"Bob", "status":"Approved", "createdDate":"1-2-2000" }, { "name":"Aaron", "status":"Rejected", "createdDate":"1-3-2000" } ]
不用先分组再提取,直接用Array.reduce()就能一步搞定,代码如下:
const data = [ { name: "Aaron", status: "Pending", createdDate: "1-1-2000" }, { name: "Bob", status: "Approved", createdDate: "1-2-2000" }, { name: "Aaron", status: "Rejected", createdDate: "1-3-2000" } ]; // 辅助函数:将MM-DD-YYYY格式的日期字符串转为Date对象,方便比较时间先后 const parseDate = (dateStr) => { const [month, day, year] = dateStr.split('-'); return new Date(year, month - 1, day); }; const result = Object.values(data.reduce((acc, curr) => { const existingItem = acc[curr.name]; // 若当前name未存储过,或当前对象的创建时间更新,则替换为当前对象 if (!existingItem || parseDate(curr.createdDate) > parseDate(existingItem.createdDate)) { acc[curr.name] = curr; } return acc; }, {})); console.log(result);
代码说明
- 用
reduce遍历数组时,借助临时对象acc存储每个name对应的最新对象 - 每次遍历都会对比当前对象与已存对象的创建时间,保留更新的那一个
- 最后通过
Object.values()将临时对象中的值转为数组,得到最终结果
如果你的日期格式是标准的YYYY-MM-DD,可以直接比较字符串,无需额外的日期解析函数。
内容的提问来源于stack exchange,提问作者jwBurnside
相关产品推荐
相关产品推荐

