You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:35:11