
本文介绍如何在 JavaScript 对象数组中按 date 字段去重:仅移除后续重复项中的 date 键值对,保留首次出现对象的完整结构,其余对象则删除 date 属性。适用于日程、排班等需合并同日多条记录的场景。
本文介绍如何在 javascript 对象数组中按 `date` 字段去重:仅移除后续重复项中的 `date` 键值对,保留首次出现对象的完整结构,其余对象则删除 `date` 属性。适用于日程、排班等需合并同日多条记录的场景。
在处理时间序列数据(如预约、课程表、值班安排)时,常需对同一天的多条记录做“逻辑合并”——即保留首条记录的完整信息(含 date),而后续同日记录仅保留业务字段(如 start、finish、id),避免日期冗余。这不同于常规的数组去重(返回唯一对象),而是选择性删除特定键值对,属于“条件式属性裁剪”。
实现的核心思路是:用 Set 追踪已出现的日期,遍历数组时判断当前对象的 date 是否已存在。若已存在,则剔除 date 属性;否则保留并将其加入 Set。
✅ 推荐方案:生成新数组(不修改原数据)
const arr = [
{ 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' }
];
const seenDates = new Set();
const result = arr.map(({ date, ...rest }) => {
if (seenDates.has(date)) {
return { ...rest }; // 移除 date,仅保留其余属性
} else {
seenDates.add(date);
return { date, ...rest }; // 保留完整对象
}
});
console.log(result);
// 输出符合预期:第2项无 date 字段,其余保持原样
该方案使用解构赋值 + 条件分支,语义清晰、可读性强,且完全函数式——不污染原始数组,符合现代前端开发最佳实践。
⚠️ 注意事项
- 不可直接修改原数组再 map:若用 forEach 配合 delete item.date 修改原对象,虽能实现效果,但会破坏数据不可变性,易引发副作用(如其他引用该对象的代码异常)。
- date 字段必须存在且为字符串:若存在 null/undefined 或格式不一致(如 '2021/10/01'),需先标准化处理,否则去重失效。
- 性能考量:对于超大数据集(>10万项),Set 查找仍为 O(1),整体时间复杂度为 O(n),高效可靠。
? 扩展:支持自定义去重字段与保留策略
若需复用逻辑于不同字段(如 userId、category),可封装为通用函数:
function removeDuplicateKey(array, key) {
const seen = new Set();
return array.map(item => {
const value = item[key];
if (seen.has(value)) {
const { [key]: _, ...rest } = item; // 安全剔除目标键
return rest;
} else {
seen.add(value);
return item;
}
});
}
// 使用示例:按 date 去重
const cleaned = removeDuplicateKey(arr, 'date');
此方法兼顾灵活性与健壮性,是处理此类“条件属性过滤”问题的推荐范式。










