TypeScript实现:检查对象属性是否包含数组所有值
解决方案:筛选满足所有筛选条件的产品对象
你的代码目前只验证了品牌和性别筛选数组的第一个元素,要实现同时满足所有勾选筛选条件的产品筛选,只需修改判断逻辑,并优化结果获取方式,以下是修改后的完整代码:
const getFilteredProducts = () => { const filterBrands: string[] = []; const filterGender: string[] = []; // 收集勾选的品牌 FilterState().brand.forEach(brand => { if (brand.checked) { filterBrands.push(brand.brand); } }); // 收集勾选的性别 FilterState().gender.forEach(genderItem => { if (genderItem.checked) { filterGender.push(genderItem.gender); } }); // 筛选出满足所有条件的产品 const filteredProducts = products?.filter(product => { // 检查所有勾选的品牌都在产品品牌属性中 const matchesBrands = filterBrands.every(brand => Object.values(product.Brand).includes(brand) ); // 检查所有勾选的性别都在产品性别属性中 const matchesGender = filterGender.every(gender => Object.values(product.Gender).includes(gender) ); // 同时满足品牌和性别条件 return matchesBrands && matchesGender; }) || []; // 这里可以根据需求处理筛选结果,比如打印或返回 console.log(filteredProducts); return filteredProducts; };
关键改动说明:
- 用
every()替代单个元素检查:every()方法会遍历筛选数组的每一个元素,只有当所有元素都满足「存在于产品对应属性中」的条件时,才返回true,完美实现全量匹配的需求。 - 改用
filter()获取结果:原代码用map()只是打印产品,改用filter()可以直接生成并返回符合条件的产品数组,更符合实际业务场景的使用需求。 - 优化遍历逻辑:把
map()换成forEach()来收集勾选条件,因为我们不需要返回新数组,只是做遍历收集,语义更清晰。 - 空筛选兼容:如果没有勾选任何品牌/性别,对应的
filterBrands/filterGender是空数组,every()对空数组会默认返回true,相当于不限制该筛选条件,符合常规筛选逻辑。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

