如何筛选对象数组中 id 不在指定数字数组内的项

10次阅读

如何筛选对象数组中 id 不在指定数字数组内的项

本文介绍如何使用 javascript 的 `Filter()` 与 `includes()` 方法,高效筛选出对象数组中 `id` 值未出现在给定数字数组中的元素,并提供可直接运行的代码示例与关键注意事项。

在实际开发中,我们常需比对两个数据集——例如,从一组位置对象中排除已被选中的 ID。给定一个目标 ID 数组(如 [60, 1456])和一个对象数组(每个对象含 id 字段),目标是找出所有 id 不在此数组中的对象

核心思路是:对对象数组调用 .filter(),对每个对象解构出 id,再用 !ids.includes(id) 判断该 id 是否不存在于目标 ID 数组中。返回值即为不匹配项组成的全新数组。

以下是完整、可执行的示例代码:

const ids = [60, 1456]; const data = [   { id: 60, itemName: 'Main Location - Cleveland' },   { id: 1453, itemName: 'Second Location - Cleveland' },   { id: 1456, itemName: 'Third Location - New York' } ];  const unmatched = data.filter(({ id }) => !ids.includes(id)); console.log(unmatched); // 输出: [{ id: 1453, itemName: 'Second Location - Cleveland' }]

优势说明

  • 语义清晰:filter + includes 组合直观表达“排除存在项”的逻辑;
  • 不修改原数组:函数式编程风格,保持数据不可变性;
  • 兼容性好:includes() 支持 ES2016+,现代浏览器node.js 环境均无兼容问题。

⚠️ 注意事项

  • 若 ids 数组很大(如超过 10,000 项),includes() 的线性查找(O(n))可能影响性能;此时建议先将 ids 转为 Set,再用 has() 实现 O(1) 查找:
    const idSet = new Set(ids); const unmatched = data.filter(({ id }) => !idSet.has(id));
  • 确保 id 类型一致(如均为数字);若存在字符串 ’60’ 与数字 60 混用,includes() 会因严格相等而返回 false,必要时可统一转换类型(如 number(id))。

综上,该方法简洁、可靠,是处理此类“对象属性是否包含于某值集合”判断任务的标准实践。

text=ZqhQzanResources