如何移除对象数组中重复的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
相关产品推荐
相关产品推荐

