You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:54:03