如何在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
相关产品推荐
相关产品推荐

