TypeScript:如何移除一维数组中不在对象数组id集合内的元素?
解决方法:基于对象数组的id过滤一维数组
嗨,我来帮你搞定这个问题~你之前的代码没法生效,是因为对对象数组的判断逻辑不对,我给你拆解一下解决方案:
为什么原来的代码不行?
你写的const array1 = array1.filter(id => array2.includes(id));里,array2.includes(id)是在检查array2数组里有没有直接等于id的元素,但array2里存的都是对象(比如{id:1, dinner:'pizza'}),不是单纯的数字id,所以这个判断永远会返回false,过滤后array1就变成空数组啦。
方案一:先提取对象数组的id,再用includes过滤
如果你习惯处理一维数组的逻辑,可以先把array2里所有对象的id提取出来,变成一个一维数组,再用你熟悉的includes方法:
const array1 = [1, 3, 15, 16, 18]; const array2 = [ { id: 1, dinner: 'pizza' }, { id: 15, dinner: 'sushi' }, { id: 18, dinner: 'hummus' } ]; // 第一步:提取array2中所有对象的id,生成一维数组 const validIds = array2.map(item => item.id); // 第二步:用validIds过滤array1,只保留存在的id const filteredArray1 = array1.filter(id => validIds.includes(id)); console.log(filteredArray1); // 输出:[1, 15, 18]
方案二:直接用some()方法判断对象数组中是否存在匹配id
如果不想额外生成数组,可以直接在filter的回调里用some()方法,它会检查array2中是否有至少一个对象的id和当前遍历的id匹配:
const array1 = [1, 3, 15, 16, 18]; const array2 = [ { id: 1, dinner: 'pizza' }, { id: 15, dinner: 'sushi' }, { id: 18, dinner: 'hummus' } ]; const filteredArray1 = array1.filter(id => { // 检查array2里有没有id匹配的对象 return array2.some(item => item.id === id); }); // 或者简写为一行: // const filteredArray1 = array1.filter(id => array2.some(item => item.id === id)); console.log(filteredArray1); // 输出:[1, 15, 18]
进阶优化(大数据量场景)
如果array2的元素很多,把validIds转成Set可以让查找速度更快:
const validIdSet = new Set(array2.map(item => item.id)); const filteredArray1 = array1.filter(id => validIdSet.has(id));
Set的has()方法时间复杂度是O(1),比数组的includes()(O(n))效率高很多,适合处理大量数据的情况。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

