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

如何移除对象数组中重复的date键值对仅保留首次出现项?

问题描述

需要处理一个包含日期和时间的对象数组,规则是:移除重复的date键值对——仅保留每个日期首次出现时的date字段,后续同日期的对象保留其他所有数据,仅删除date键。

原数组示例:

[
    {
      'id': '1',
      'date': '2021-10-01',
      'start': '10:00:00',
      'finish': '12:00:00'
    },
    {
      'id': '2',
      'date': '2021-10-01',
      'start': '13:00:00',
      'finish': '14:00:00'
    },
    {
      'id': '3',
      'date': '2021-10-02',
      'start': '13:00:00',
      'finish': '14:00:00'
    },
    {
      'id': '4',
      'date': '2021-10-03',
      'start': '13:00:00',
      'finish': '14:00:00'
    }
]

期望处理结果:

[
    {
      'id': '1',
      'date': '2021-10-01',
      'start': '10:00:00',
      'finish': '12:00:00'
    },
    {
      'id': '2',
      'start': '13:00:00',
      'finish': '14:00:00'
    },
    {
      'id': '3',
      'date': '2021-10-02',
      'start': '13:00:00',
      'finish': '14:00:00'
    },
    {
      'id': '4',
      'date': '2021-10-03',
      'start': '13:00:00',
      'finish': '14:00:00'
    }
]
解决方案

这里提供一种高效的JavaScript实现方式,用Array.reduce()遍历数组,配合Set跟踪已出现的日期:

const originalArray = [/* 替换为你的原数组 */];
const seenDates = new Set();

const processedArray = originalArray.reduce((result, currentItem) => {
  // 复制当前对象,避免修改原数组的原始数据
  const item = {...currentItem};
  
  if (seenDates.has(item.date)) {
    // 该日期已出现过,删除date字段
    delete item.date;
  } else {
    // 首次出现该日期,记录到集合中
    seenDates.add(item.date);
  }
  
  result.push(item);
  return result;
}, []);

// 输出处理后的数组
console.log(processedArray);

逻辑解释

  • Set用来存储已经出现过的日期,查询时间复杂度为O(1),保证处理大数组时的性能
  • 每次遍历都复制当前对象(用扩展运算符...),避免污染原始数据
  • 核心判断:如果当前日期已在seenDates中,就删除对象的date键;否则保留date并将日期加入集合

内容的提问来源于stack exchange,提问作者nsbrown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:40:31