本文介绍如何高效识别一个数字数组中哪些值未作为 id 出现在对象数组中,推荐使用 set 构建哈希查找表,实现 o(1) 查找,避免嵌套遍历带来的性能损耗。
在实际开发中,我们常需比对两类数据:一组是包含结构化信息的对象(如带 id 字段的地点列表),另一组是简单数值数组(如待校验的 ID 列表)。目标是快速定位「数组中有、但对象中无对应 id」的数值——即差集中的缺失项。
最直观的写法可能是用 filter + find,例如:
const missing = idList.filter(id => !itemList.find(item => item.id === id) );
但该方式时间复杂度为 O(n × m)(n 为数组长度,m 为对象列表长度),当数据量增大时性能急剧下降。
✅ 更优解是空间换时间:

const itemList = [
{ id: 60, itemName: 'Main Location - 1100 Superior Road - Cleveland' },
{ id: 1456, itemName: 'Third Location - 107, West 20th Street, Manhattan - New York' },
];
const idList = [60, 1453, 1456];
// 步骤 1:构建 id 快速查找集合
const idLookup = new Set(itemList.map(({ id }) => id));
// 步骤 2:过滤出不在集合中的 ID
const missingIds = idList.filter(id => !idLookup.has(id));
console.log(missingIds); // [1453]? 为什么用 Set 而不用 Array.includes()?
Array.includes() 内部仍需线性扫描;而 Set.has() 基于哈希表实现,无论数据规模多大,单次查询几乎恒定耗时。尤其当 itemList 含数百或上千项时,性能优势显著。
⚠️ 注意事项:
总结:面对「查找数组中未映射到对象 ID 的值」这类问题,优先构建 Set 查找表,再执行单次过滤——简洁、高效、可扩展,是现代 JavaScript 数据比对的标准实践。