You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中根据对象数组的id过滤数值数组?

解决数组元素匹配移除的问题

嘿,我来帮你排查下代码没生效的原因,再给你几个可行的方案~

首先,你代码里的arr2.includes(e => e.id === x)是关键问题:Array.prototype.includes()的作用是检查数组中是否存在某个具体的原始值/引用值,它并不接受回调函数作为参数,所以这行代码永远会返回false,导致!false变成true,最终filter会保留所有元素,达不到你想要的效果。

ES6原生解法

方法1:使用some()配合filter()

some()方法会遍历数组,只要有一个元素满足回调的条件就返回true,正好适合用来判断当前arr1的元素是否在arr2的id列表里:

let arr1 = [1, 2, 3, 4, 5];
let arr2 = [ {name: "banana", id: 1}, {name: "mango", id: 3} ];

let newArr = arr1.filter(x => !arr2.some(item => item.id === x));
console.log(newArr); // 输出 [2, 4, 5]

方法2:用Set优化性能(适合大数据量场景)

如果arr2的元素很多,每次filter都遍历一遍arr2会有点低效。我们可以先把arr2的id提取成一个Set集合(集合的查找效率是O(1)),再进行过滤:

let arr1 = [1, 2, 3, 4, 5];
let arr2 = [ {name: "banana", id: 1}, {name: "mango", id: 3} ];

// 先提取所有需要排除的id到Set里
const excludeIds = new Set(arr2.map(item => item.id));
// 过滤arr1中不在排除列表里的元素
let newArr = arr1.filter(x => !excludeIds.has(x));
console.log(newArr); // 输出 [2, 4, 5]

Lodash解法

如果你习惯用Lodash,可以结合_.difference和_.map来快速实现:

const _ = require('lodash'); // 确保已安装并引入Lodash

let arr1 = [1, 2, 3, 4, 5];
let arr2 = [ {name: "banana", id: 1}, {name: "mango", id: 3} ];

// 先用_.map提取arr2的id数组,再用_.difference求两个数组的差集
let newArr = _.difference(arr1, _.map(arr2, 'id'));
console.log(newArr); // 输出 [2, 4, 5]

内容的提问来源于stack exchange,提问作者Radical_Activity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:17:56