如何筛选数组实现完全匹配?对象数组的全元素包含校验
数组过滤解决方案
可以通过数组方法组合或手动循环两种方式实现需求,以下是具体实现:
一、数组方法组合(推荐,代码更简洁)
利用filter()遍历原始数组筛选符合条件的对象,搭配every()校验搜索数组的所有元素是否都存在于当前对象的arrayStrings中:
const originalArray = [ { name: "1", arrayStrings: ["Text1", "Text2"], }, { name: "2", arrayStrings: ["Text1", "Text2", "Text3"], }, ]; const arrayForSearch = ["Text1", "Text2", "Text3"]; const filterMatchingObjects = (original, search) => { return original.filter(obj => { // 校验搜索数组的每一个元素是否都在当前对象的arrayStrings里 return search.every(item => obj.arrayStrings.includes(item)); }); }; // 调用函数得到结果 const resultArray = filterMatchingObjects(originalArray, arrayForSearch); console.log(resultArray); // 输出:[{ name: "2", arrayStrings: ["Text1", "Text2", "Text3"] }]
性能优化版(适合搜索数组较大的场景)
把搜索数组转为Set,用has()替代includes()提升查找效率:
const filterMatchingObjects = (original, search) => { const searchSet = new Set(search); return original.filter(obj => { const objStringSet = new Set(obj.arrayStrings); return [...searchSet].every(item => objStringSet.has(item)); }); };
二、手动循环实现
如果更习惯用循环逻辑,也可以通过双层循环完成筛选:
const filterMatchingObjects = (original, search) => { const result = []; // 遍历原始数组的每个对象 for (const obj of original) { let allElementsMatch = true; // 遍历搜索数组的每个元素 for (const item of search) { if (!obj.arrayStrings.includes(item)) { allElementsMatch = false; break; // 只要有一个元素不匹配,直接跳出内层循环 } } if (allElementsMatch) { result.push(obj); } } return result; };
内容的提问来源于stack exchange,提问作者user18119766
相关产品推荐
相关产品推荐

