合并两个对象数组并跳过重复项,jQuery.merge出现重复结果如何解决
解决方案
对象数组无法直接通过普通合并方法自动去重,核心原因是对象是引用类型,直接判等不会对比内部属性。你可以基于唯一标识BookingId作为去重判断依据,以下是具体实现方法:
方法1:原生JS实现(无额外依赖,推荐)
利用Set存储已出现的唯一标识,合并数组后过滤重复项,时间复杂度为O(n):
// 存储已出现的BookingId,判断重复效率更高 const existedBookingIds = new Set(); // 合并两个数组后去重 const mergedResult = [...Array1, ...Array2].filter(item => { if (!existedBookingIds.has(item.BookingId)) { existedBookingIds.add(item.BookingId); return true; } return false; });
如果需要兼容不支持ES6语法的旧环境,可改用以下写法:
var existedBookingIds = {}; var mergedResult = Array1.concat(Array2).filter(function(item) { if (!existedBookingIds[item.BookingId]) { existedBookingIds[item.BookingId] = true; return true; } return false; });
方法2:结合jQuery方法实现
如果你希望沿用jQuery的相关API,可结合$.merge和$.grep实现,同时避免修改原数组:
var existedBookingIds = {}; // $.extend做浅拷贝避免$.merge修改原Array1 var mergedResult = $.grep($.merge($.extend([], Array1), Array2), function(item) { if (!existedBookingIds[item.BookingId]) { existedBookingIds[item.BookingId] = true; return true; } return false; });
注意事项
- 如果重复判断需要对比对象所有属性,可将
BookingId替换为JSON.stringify(item),仅适用于两个数组中对象的字段顺序完全一致的场景。 - 如果重复项的属性存在差异,可根据需求调整保留逻辑,比如保留后出现的数组的项,只要调整合并顺序即可。
内容的提问来源于stack exchange,提问作者Ghulam Shahbaz
相关产品推荐
相关产品推荐

