使用Lambda函数从两个TypeScript对象数组中查找共同对象
用TypeScript提取两个对象数组的共同元素
嘿,这个需求挺常见的,咱们完全可以用原生TypeScript/JavaScript的方法搞定,不用依赖任何第三方库~
方法一:基于唯一ID(推荐,性能更优)
既然每个对象都有唯一的id字段,咱们可以利用这个标识来高效筛选,这种方法的时间复杂度是O(n+m),比双重循环的O(n*m)要高效得多,数组越大优势越明显。
// 先定义类型让代码更规范(TypeScript专属) interface Vehicle { id: number; name: string; } const firstArray: Vehicle[] = [ { "id": 4, "name": "Tata" }, { "id": 11, "name": "Maruti" }, { "id": 14, "name": "Mahindra" } ]; const secondArray: Vehicle[] = [ { "id": 4, "name": "Tata" }, { "id": 11, "name": "Maruti" }, { "id": 15, "name": "Hyundai" }, { "id": 21, "name": "Honda" } ]; // 第一步:把第一个数组的id存入Set,实现O(1)时间的快速查找 const firstIds = new Set(firstArray.map(item => item.id)); // 第二步:遍历第二个数组,筛选出id在Set中的对象 const commonElements = secondArray.filter(item => firstIds.has(item.id)); console.log(commonElements); // 输出:[ { id: 4, name: 'Tata' }, { id: 11, name: 'Maruti' } ]
方法二:严格比对所有属性(适合需要完全匹配的场景)
如果你的场景里id可能不唯一,或者需要确保对象的所有属性都完全一致,可以用这个方法。注意这是浅比对,如果对象有嵌套属性,需要改成深比对逻辑。
interface Vehicle { id: number; name: string; } const firstArray: Vehicle[] = [ { "id": 4, "name": "Tata" }, { "id": 11, "name": "Maruti" }, { "id": 14, "name": "Mahindra" } ]; const secondArray: Vehicle[] = [ { "id": 4, "name": "Tata" }, { "id": 11, "name": "Maruti" }, { "id": 15, "name": "Hyundai" }, { "id": 21, "name": "Honda" } ]; // 自定义对象比对函数:浅比对所有属性 function areObjectsEqual(obj1: Vehicle, obj2: Vehicle): boolean { const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); // 先判断键的数量是否一致 if (keys1.length !== keys2.length) return false; // 逐个比对每个键对应的值 for (const key of keys1) { // 这里用类型断言确保key是Vehicle的属性 if (obj1[key as keyof Vehicle] !== obj2[key as keyof Vehicle]) { return false; } } return true; } // 筛选出两个数组中完全匹配的对象 const commonElements = firstArray.filter(item1 => secondArray.some(item2 => areObjectsEqual(item1, item2)) ); console.log(commonElements); // 输出同样是目标结果
简单解释下两种方法的区别:
- 方法一依赖唯一ID,性能拉满,是绝大多数场景的首选;
- 方法二做全属性比对,更严谨但性能稍差,适合对匹配精度要求极高的场景。
内容的提问来源于stack exchange,提问作者Morez
相关产品推荐
相关产品推荐

