如何在JavaScript中按日期范围从对象数组中获取最新唯一数据
问题根因
你的现有代码存在两个问题:
- 未提前对账单数组按日期倒序排序,无法保证最新账单优先被匹配
- reduce去重逻辑只会保留首次遇到的同customer_id数据,如果旧账单排在数组靠前位置,最终只会留存旧数据,无法得到最新账单
解决代码
基础实现(适用于小数据量)
先将数组按from_date倒序排列,让最新账单排在最前面,再按customer_id去重即可,如需同时校验to_date,可在排序逻辑中追加对应比较规则:
// 按from_date倒序排序,日期越新排序越靠前 const sortedBills = res.data.sort((a, b) => new Date(b.from_date) - new Date(a.from_date)) // 去重保留每个customer_id第一条(最新)数据 const filtered = sortedBills.reduce((accumulator, current) => { if (!accumulator.find(x => x.customer_id === current.customer_id)) { accumulator.push(current); } return accumulator; }, []); console.log(filtered);
高性能实现(适用于大数据量)
使用Map替代find降低时间复杂度,数据量较大时性能提升更明显:
const filtered = Array.from( res.data .sort((a, b) => new Date(b.from_date) - new Date(a.from_date)) .reduce((map, current) => { if (!map.has(current.customer_id)) { map.set(current.customer_id, current) } return map }, new Map()) .values() )
上述代码输出结果和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

