JavaScript遍历两数组,校验首个数组id值是否存在于第二个数组
高性能验证数组对象指定键值的存在性
要验证第一个数组(待比对数组)中所有对象的指定键值都存在于第二个数组中,最优性能的方案是利用Set的O(1)查找特性,将时间复杂度控制在线性级别:
实现思路
- 先将第二个数组中所有对象的目标键值提取出来,存入一个Set集合中——这一步的时间复杂度是O(m)(m为第二个数组的长度)。
- 遍历第一个数组,检查每个对象的目标键值是否存在于Set中——这一步的时间复杂度是O(n)(n为第一个数组的长度)。
- 最终通过
every方法确保所有元素都满足条件,返回布尔值。
代码实现
function allTargetValuesExist(sourceArray, referenceArray, key = 'id') { // 提取参考数组的目标键值到Set const referenceValues = new Set(referenceArray.map(item => item[key])); // 校验源数组所有元素的目标键值是否都在Set中 return sourceArray.every(item => referenceValues.has(item[key])); }
示例测试
用你提供的数组进行测试:
const array1 = [{name:'Linus',id:1},{name:'Anthony',id:2},{name:'Carl',id:3}]; const array2 = [{name:'Linus',id:1},{name:'Anthony',id:2},{name:'Beth',id:3},{name:'Kyle',id:4}]; // 验证array1的所有id是否存在于array2中 console.log(allTargetValuesExist(array1, array2)); // 输出: true
如果修改array1,加入一个不存在于array2的id:
const array1 = [{name:'Linus',id:1},{name:'Anthony',id:2},{name:'Carl',id:5}]; console.log(allTargetValuesExist(array1, array2)); // 输出: false
性能优势对比
- 若采用双重循环(遍历array1的每个元素后,再遍历array2查找),时间复杂度为O(n*m),当数组元素较多时性能会急剧下降。
- 采用Set的方案,总时间复杂度为O(n+m),空间复杂度为O(m)(存储Set的开销),是时间换空间的最优选择,在大数据量场景下优势明显。
边界情况处理
- 若
sourceArray为空数组,会直接返回true(空数组默认满足“所有元素都存在”的条件)。 - 若
referenceArray为空数组且sourceArray非空,会返回false。 - 如果存在对象缺失目标键的情况,对应的键值会是
undefined,此时会校验undefined是否存在于参考数组的键值中,可根据需求添加额外的键存在性判断。
内容的提问来源于stack exchange,提问作者user10900615
相关产品推荐
相关产品推荐

