对数据库中的数据放置多个过滤器

时间:2019-09-07 15:59:22

标签: javascript arrays vue.js filtering vuetify.js

我正在从数据库中获取数据。

数据的结构如下:

serie
   --- title (string)
   --- category (array)

我用搜索属性制作了搜索过滤器。看起来像这样:

filteredSeries () {
  return this.series.filter(serie => {
    return serie.title.toLowerCase().match(this.search.toLowerCase())
  })
}

我正在遍历这样的系列:

<v-flex xs12 sm4 md3 lg2 v-for="serie in filteredSeries" :key="serie.title" pa-3>

.....

</v-flex>

搜索词来自这里:

<v-text-field label="Search" height="35" v-model="search" prepend-inner-icon="search"></v-text-field>

一切正常,但是现在我们可以解决我的问题了。我不仅要按标题过滤系列,而且要按类别过滤。

我从数组的数据方法中获取所有类别,如下所示:

data () {
  return {
    series: [],
    search: '',
    categories: [
      'Crime', 'Drama', 'Mistery', 'Comedy', 'Horror', 'Sci-Fi'
    ],
    filterCategory: []
  }
},

过滤器选择填充有如下数据:

<v-select  prepend-inner-icon="category" height="35" v-model="filterCategory" :items="categories" chips label="Category" multiple></v-select>

此选择返回filterCategory数组。现在我想要的是获得带有filterCategory中选定的特定类别的系列。我不知道该怎么做。我认为,如果可以在按搜索字词进行过滤的计算属性中包含按类别进行过滤,那将是完美的。

欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

您的过滤器方法可以修改为也可以通过filteredCategories进行过滤。

我们可以使用JavaScript的Array.every()Array.includes()方法。

此外,我将使用String.includes()而不是String.match(),因为在对正则表达式进行搜索时通常会使用match()

filteredSeries () {

  // Filtering by selected categories.
  const filteredSeries = this.series.filter(serie => {
    return this.filteredCategories.every(category => {
      return serie.categories.includes(category);
    });
  });

  // Further filtering by search word.
  return filteredSeries.filter(serie => {
      return serie.title.toLowerCase().includes(this.search.toLowerCase()));
  });
}