
本文介绍如何使用 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))。
综上,该方法简洁、可靠,是处理此类“对象属性是否包含于某值集合”判断任务的标准实践。










