过滤数组:如何订购过滤器

丹那林

有2个组件:

  1. 设置状态的过滤器组件
  2. 一个输出组件,可根据过滤器呈现项目

有2个数组:

  1. 所有项目的数组
  2. 所选过滤选项的数组。
    let itemsFiltered;
    if (this.state.continent !== "") { itemsFiltered = items.filter( (item) => item.continent == this.state.continent ); }
    if (this.state.country !== "") { itemsFiltered = items.filter( (item) => item.country == this.state.country ); }
    if (this.state.region !== "") { itemsFiltered = items.filter((item) => item.region == this.state.region); }
    if (this.state.activity !== "") { itemsFiltered = items.filter((item) => item.activity == this.state.activity); }
    if (this.state.skill !== "") { itemsFiltered = items.filter((item) => item.skill == this.state.skill); }

问题:它不适用于技能和区域。对于技能而言,如果首先选择它,它将起作用,但是如果已经进行了其他选择,则不会。对于区域,它根本根本不应用过滤器。因此,它仅显示了与过滤器集无关的所有项目。它适用于所有其他过滤器及其组合。

这是数据的样子(虚拟):

{
    title: "Item 1",
    description: "Description of the item",
    image: imageItem1,
    continent: "europe",
    country: "portugal",
    region: "norte",
    activity: "kite",
    skill: "proLocal",
},

您将如何编写它以使其起作用?过滤器的顺序应该不同还是我缺少其他方法?

扩展(下面的注释代码):尝试遍历过滤器失败,因为您无法遍历状态对象:

    let itemsFiltered = items.slice();
    const filtersSet = ["continent", "country", "region", "activity", "skill"]
    for (let i = 0; i < filtersSet.length; i++) {
      if (this.state.filtersSet[i] !== "") {itemsFiltered = itemsFiltered.filter( item => item.filtersSet[i] == this.state.filtersSet[i] );}
    }
德鲁·里斯(Drew Reese)

问题

似乎每个过滤器操作都不能完全覆盖每个过滤器操作,因为每个过滤器操作会完全覆盖以前的任何过滤结果。

let itemsFiltered;
if (this.state.continent !== "") {
  itemsFiltered = items.filter(
    (item) => item.continent == this.state.continent
  );
}
if (this.state.country !== "") {
  itemsFiltered = items.filter((item) => item.country == this.state.country);
}
if (this.state.region !== "") {
  itemsFiltered = items.filter((item) => item.region == this.state.region);
}
if (this.state.activity !== "") {
  itemsFiltered = items.filter((item) => item.activity == this.state.activity);
}
if (this.state.skill !== "") {
  itemsFiltered = items.filter((item) => item.skill == this.state.skill);
}

您可以从上一个过滤器操作的结果中过滤每个随后的过滤器。

let itemsFiltered = items.slice();
if (this.state.continent !== "") {
  itemsFiltered = itemsFiltered.filter(item => item.continent === this.state.continent);
}
if (this.state.country !== "") {
  itemsFiltered = itemsFiltered.filter(item => item.country === this.state.country);
}
if (this.state.region !== "") {
  itemsFiltered = itemsFiltered.filter(item => item.region === this.state.region);
}
if (this.state.activity !== "") {
  itemsFiltered = itemsFiltered.filter(item => item.activity === this.state.activity);
}
if (this.state.skill !== "") {
  itemsFiltered = itemsFiltered.filter(item => item.skill == this.state.skill);
}

或节省大量的数组迭代次数,都可以在单个过滤器函数中完成所有操作。

const itemsFiltered = items.filter((item) => {
  if (this.state.continent) return item.continent === this.state.continent;
  if (this.state.country) return item.country === this.state.country;
  if (this.state.region) return item.region === this.state.region;
  if (this.state.activity) return item.activity === this.state.activity;
  if (this.state.skill) return item.skill === this.state.skill;
  return true;
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

django 过滤器水平,无需订购

来自分类Dev

如何使用Nokogiri过滤数组(搜索,过滤器,条件等)

来自分类Dev

如何使用过滤器设置过滤数组?

来自分类Dev

如何使用Javascript数组过滤器过滤0?

来自分类Dev

Javascript过滤器数组

来自分类Dev

如何过滤数据过滤器jQuery

来自分类Dev

如何从AngularJS过滤器的数组中排除对象?

来自分类Dev

脚本-如何基于数组的长度/大小创建过滤器?

来自分类Dev

如何按特定过滤器对数组排序?

来自分类Dev

数组内的过滤器数组

来自分类Dev

您如何在ffmpeg中订购过滤器有关系吗?

来自分类Dev

Swift过滤器嵌套对象数组

来自分类Dev

带标题的数组的javascript过滤器

来自分类常见问题

javascript过滤器数组多个条件

来自分类Dev

使用NSPredicate的Swift过滤器数组

来自分类Dev

JSON数组的交叉过滤器维度

来自分类Dev

掩码数组的中值过滤器

来自分类Dev

RxSwift过滤器变量数组

来自分类Dev

Elasticsearch数组查询/过滤器

来自分类Dev

JavaScript过滤器返回空数组

来自分类Dev

数组中的Javascript嵌套过滤器

来自分类Dev

过滤器数组并返回特定属性

来自分类Dev

数组的SQL过滤器元素

来自分类Dev

按键上的JS过滤器数组

来自分类Dev

mongodb嵌套文档的过滤器数组

来自分类Dev

类型数组上的IQueryable过滤器

来自分类Dev

与过滤器关联的数组差异

来自分类Dev

部分数组过滤器

来自分类Dev

Swift过滤器嵌套数组