如何在JavaScript数组中忽略时间按日期去重对象
去除JSON数组中仅eventDate时间部分不同的重复条目
1. 实现日期格式化函数
先写一个函数,把带时间的日期字符串(比如"August 15, 2022 at 9:00 AM")转换成"Mon Aug 15 2022"格式:
function formatEventDate(dateStr) { // 拆分字符串提取纯日期部分 const dateSegment = dateStr.split(' at ')[0]; // 转成Date对象后调用toDateString得到目标格式 return new Date(dateSegment).toDateString(); }
2. 处理数组并完成去重
遍历原始数组,统一格式化每个对象的eventDate,再利用Map实现去重(重复日期默认保留最后一个出现的对象,若要保留第一个可改用forEach遍历判断):
// 你的原始数据数组 const originalData = [ { formField7: "Test", amountDue: "Test", serviceType: "Course", staffMember: "Test", formField2: "Test", formResponse2: "-", formResponse7: "Test", formField6: "Test", formField10: "Test", paymentStatus: "Test", formField1: "Test", dateOfBooking: "Test", _id: "Test", _owner: "Test", _createdDate: "Test", serviceName: "Test", formField8: "Test", paymentMethod: "Test", groupSize: "1", formField4: "Test", formResponse1: "Test", formField5: "Test", _updatedDate: "Test", formResponse5: "Test", eventDate: "August 15, 2022 at 9:00 AM", formResponse8: "Test", couponName: "Test", formResponse0: "Test", formResponse11: "Test", clientEmail: "Test", formField9: "Test", attendanceStatus: "Test", sessionDuration: "Test", formField3: "Test", formResponse4: "-", clientAddress: "-", formResponse9: "Test", clientName: "Jane Doe", formField11: "Test", formResponse6: "Test", formField0: "Test", bookingStatus: "Test", clientPhoneNumber: "Test", amountPaid: "Test", formResponse10: "Test", formResponse3: "Test" }, { formField7: "Test", amountDue: "Test", serviceType: "Course", staffMember: "Test", formField2: "Test", formResponse2: "-", formResponse7: "Test", formField6: "Test", formField10: "Test", paymentStatus: "Test", formField1: "Test", dateOfBooking: "Test", _id: "Test", _owner: "Test", _createdDate: "Test", serviceName: "Test", formField8: "Test", paymentMethod: "Test", groupSize: "1", formField4: "Test", formResponse1: "Test", formField5: "Test", _updatedDate: "Test", formResponse5: "Test", eventDate: "August 15, 2022 at 1:00 AM", formResponse8: "Test", couponName: "Test", formResponse0: "Test", formResponse11: "Test", clientEmail: "Test", formField9: "Test", attendanceStatus: "Test", sessionDuration: "Test", formField3: "Test", formResponse4: "-", clientAddress: "-", formResponse9: "Test", clientName: "Jane Doe", formField11: "Test", formResponse6: "Test", formField0: "Test", bookingStatus: "Test", clientPhoneNumber: "Test", amountPaid: "Test", formResponse10: "Test", formResponse3: "Test" } ]; // 格式化所有对象的eventDate字段 const formattedArray = originalData.map(item => ({ ...item, eventDate: formatEventDate(item.eventDate) })); // 去重:利用Map的键唯一性,重复日期只保留最后一个 const uniqueArray = [...new Map(formattedArray.map(item => [item.eventDate, item])).values()]; // 若要保留第一个出现的重复项,可改用下面的写法 // const uniqueArray = []; // const dateTracker = new Map(); // formattedArray.forEach(item => { // if (!dateTracker.has(item.eventDate)) { // dateTracker.set(item.eventDate, item); // uniqueArray.push(item); // } // }); console.log(uniqueArray);
关键说明
- 日期格式化通过
split(' at ')拆分字符串,精准提取不含时间的日期部分,再借助Date.toDateString()自动生成Mon Aug 15 2022格式的字符串 - 去重逻辑依赖
Map的键唯一性,确保同一日期只保留一个对象
内容的提问来源于stack exchange,提问作者user9138698
相关产品推荐
相关产品推荐

