如何提取两个JavaScript数组中的重复对象?
找出两个数组中id相同的对象交集
嘿,我来帮你搞定这个需求!要得到两个数组里id相同的对象组成的新数组,有几种简单实用的方法,我给你一步步讲清楚:
方法1:直观的filter + some组合
这是最容易理解的方式,直接遍历其中一个数组,检查另一个数组里是否存在id相同的对象:
var array1 = [{ id: 1 }, { id: 4}, { id: 3 }]; var array2 = [{ id: 1 }, { id: 2}]; const intersection = array1.filter(itemFromArr1 => array2.some(itemFromArr2 => itemFromArr1.id === itemFromArr2.id) ); console.log(intersection); // 输出: [{ id: 1 }]
filter负责筛选array1中符合条件的元素some用来判断array2里是否存在和当前元素id一致的对象,只要找到一个就返回true
方法2:用Set优化性能(适合大数据量)
如果你的数组元素很多,上面的方法因为每次都要遍历array2,性能会有点慢。这时候可以先把array2的id存到Set里,利用Set的快速查找特性来优化:
var array1 = [{ id: 1 }, { id: 4}, { id: 3 }]; var array2 = [{ id: 1 }, { id: 2}]; // 先提取array2的所有id到Set中 const arr2IdSet = new Set(array2.map(item => item.id)); // 筛选array1中id存在于Set里的元素 const intersection = array1.filter(item => arr2IdSet.has(item.id)); console.log(intersection); // 输出: [{ id: 1 }]
Set的has方法查找时间复杂度是O(1),比some的O(n)高效很多,数组越大,性能提升越明显。
补充说明
- 上面的例子都是基于
id属性判断对象是否“相同”,如果需要匹配多个属性,只需要调整判断条件即可,比如:// 匹配id和name都相同的对象 array1.filter(item1 => array2.some(item2 => item1.id === item2.id && item1.name === item2.name) ); - 如果你需要从array2里取匹配的对象,只需要把filter的数组换成array2就行,逻辑是一样的。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

