如何根据另一个数组的嵌套ID列表过滤数组?求正确实现方案
问题:过滤数组保留不在指定ID集合中的元素
给定两个数组:
const array1 = [{id: 1, name: "test"}, {id: 2, name: "test2"}, {id: 3, name: "test3"}]; const array2 = [{weight: 1, ids: [1]}, {weight: 3, ids: [3]}]; // 注:原代码中array2第二个对象的weight后缺少冒号,已修正语法错误
需求:过滤array1,仅保留id不存在于array2中任何ids数组内的元素。
你尝试的代码:
array1.filter((item) => !array1?.filter((item2) => item2?.ids?.includes(item.id) ) )
返回空数组的原因有两个:
- 内层错误遍历了
array1而非目标数组array2,完全找错了判断依据; filter返回的是数组,哪怕找到匹配项,非空数组在逻辑判断中会被视为true,因此!array1.filter(...)永远为false,导致所有元素都被过滤。
正确解法
方法1:用Set优化查询效率(推荐)
先把array2中所有需要排除的ID收集到Set集合中(查询ID的时间复杂度为O(1),适合大数据量场景),再过滤array1:
// 收集所有需要排除的ID const excludedIds = new Set(array2.flatMap(item => item.ids)); // 过滤array1,保留不在排除列表中的元素 const filteredArray = array1.filter(item => !excludedIds.has(item.id)); console.log(filteredArray); // 输出:[{id: 2, name: "test2"}]
方法2:直接遍历判断(适合小数组)
如果数据量不大,可直接在filter中用some判断当前元素的id是否存在于array2的任意ids数组中:
const filteredArray = array1.filter(item => { // 只要array2里有一个对象的ids包含当前id,就排除该元素 return !array2.some(arr2Item => arr2Item.ids.includes(item.id)); }); console.log(filteredArray); // 输出:[{id: 2, name: "test2"}]
内容的提问来源于stack exchange,提问作者Jm3s
相关产品推荐
相关产品推荐

