如何用TypeScript判断数组元素是否存在于对象数组的code属性中?
检查数组元素是否存在于对象数组的指定属性中
首先来看给定的两个数组:
const array1 = ['A', 'B', 'C', 'D']; const array2 = [ {category: 'photos', code: 'A', fileName: '1664725062718.jpg', size: 120306}, {category: 'photos', code: 'F', fileName: '1664725062718.jpg', size: 120306}, {category: 'photos', code: 'K', fileName: '1664725062718.jpg', size: 120306}, ];
需求是编写一个函数,判断array1中的任意元素是否存在于array2中对象的code属性,并返回布尔值。
之前尝试的代码无法正常工作:
array1.some(value => array2.includes(value))
原因是array2的元素是对象,includes会直接比较引用值,而不是对象的code属性,所以无法匹配到目标值。
正确的TypeScript实现方案
方案1:嵌套使用some方法
这种方式逻辑直观,直接遍历两个数组完成匹配检查:
const hasMatchingCode = array1.some(value => array2.some(item => item.code === value) );
- 外层
array1.some遍历每个元素,只要有一个元素满足条件就返回true - 内层
array2.some检查当前array1元素是否存在于某个对象的code属性中
方案2:利用Set优化性能(推荐大数据量场景)
如果数组元素较多,先提取array2的code到Set中再查找,能将时间复杂度从O(n*m)降低到O(n+m),大幅提升性能:
// 提取所有code到Set集合 const codeSet = new Set(array2.map(item => item.code)); // 检查array1是否有元素在Set中 const hasMatchingCode = array1.some(value => codeSet.has(value));
带类型定义的完整封装
如果需要严格的类型约束,可以定义对象类型并封装成可复用函数:
// 定义array2元素的类型 interface FileItem { category: string; code: string; fileName: string; size: number; } const array1: string[] = ['A', 'B', 'C', 'D']; const array2: FileItem[] = [ {category: 'photos', code: 'A', fileName: '1664725062718.jpg', size: 120306}, {category: 'photos', code: 'F', fileName: '1664725062718.jpg', size: 120306}, {category: 'photos', code: 'K', fileName: '1664725062718.jpg', size: 120306}, ]; // 封装成可复用函数 function hasMatchingCode(arr1: string[], arr2: FileItem[]): boolean { const codeSet = new Set(arr2.map(item => item.code)); return arr1.some(value => codeSet.has(value)); } // 调用示例 const result = hasMatchingCode(array1, array2); // 返回true,因为'A'存在于array2的code属性中
内容的提问来源于stack exchange,提问作者Miomir Dancevic
相关产品推荐
相关产品推荐

