You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Vue中如何用computed属性结合数组包含关系筛选数据?

搞定这个筛选问题!

你的原代码之所以失效,是因为 this.checked.includes(product.categories) 是在判断「整个product.categories数组」是否是checked数组里的元素,但checked里全是字符串,自然永远匹配不上。

我们可以根据实际筛选需求来调整逻辑,常见的两种场景如下:

场景1:只要产品有一个分类匹配选中标签(复选框「或」逻辑)

这是最常见的复选框筛选逻辑——只要产品分类和选中标签有任意重叠就显示。我们可以用some方法来判断两个数组是否存在交集:

computed: {
  filterProducts() {
    // 没有选中任何标签时,直接返回全部产品
    if (this.checked.length === 0) return this.products;
    
    return this.products.filter(product => {
      // 检查当前产品的分类中,是否至少有一个在选中列表里
      return product.categories.some(category => this.checked.includes(category));
    });
  }
}

用你的测试数据验证:

  • checked['orange', 'apple', 'juice']
  • 产品的categories['apple', 'juice'],其中applejuice都在选中列表中,所以这个产品会被保留下来。

场景2:产品分类必须包含所有选中标签(复选框「与」逻辑)

如果需要产品的分类包含所有选中的标签才显示,就用every方法:

computed: {
  filterProducts() {
    if (this.checked.length === 0) return this.products;
    
    return this.products.filter(product => {
      // 检查所有选中的标签,都存在于当前产品的分类中
      return this.checked.every(category => product.categories.includes(category));
    });
  }
}

注意:用你的测试数据的话,这个产品会被过滤掉——因为checked里的orange不在产品的categories中,every判断会返回false

内容的提问来源于stack exchange,提问作者sid heart

火山引擎 最新活动