【问题标题】:Combining filter and includes to filter multiple values结合过滤器和包含过滤多个值
【发布时间】:2019-06-24 15:30:32
【问题描述】:

我正在尝试通过过滤掉当前状态中的值来创建新状态。

        // Create new state
        const defaultState = [...this.state.defaultData];
        newState = defaultState.filter(movies => !filteredItems.includes(movies.genre_ids));

我认为我的问题可能是遍历到子对象数组,因为当我这样做时,我只得到一个空白结果。

示例 JSON(我正在尝试按流派 ID 过滤:

https://api.themoviedb.org/3/movie/now_playing?api_key=39b616a19667f17d8ffcaa175fc93491&language=en-US&page=1

我已经尝试过对值进行硬编码,但这是行不通的。但是,我确实尝试使用相同的方法按标题过滤,并对标题进行硬编码,这确实有效。因此,为什么我认为可能是我进入genre_ids 的问题?

我创建了一个堆栈闪电战来显示当前的状态: https://react-sxyyfp.stackblitz.io

预期结果是,当您选中多个复选框,然后取消选中以删除该特定过滤器时,仍会应用当前活动的过滤器。

【问题讨论】:

  • 您能否向我们展示在未选中某个框时从过滤器中删除 ID 的功能?
  • 你应该尝试克隆对象
  • movies.genre_ids 看起来像是包含一个数据数组。我不相信您可以直接将其传递给 .includes 方法。您可能必须使用过滤器遍历 _ids 数组

标签: javascript arrays reactjs filter include


【解决方案1】:

由于movies.genre_ids 是您提供的链接中的一个数组,我建议遍历其中的每个id 并检查是否有一个对应,这可以使用some 来完成:

const defaultState = [...this.state.defaultData];
newState = defaultState.filter(movies => movies.genre_ids.some(genre => !filteredItems.includes(genre)));

如果您的电影中的单个id 也在用户给定的过滤器中,则some 将返回true


编辑

在此处更新您的状态的适当方法是使用setState 的回调版本并使用您之前的状态来更改新的状态:

this.setState(prev => ({
    defaultData: prev.defaultData.filter(movies => movies.genre_ids.some(genre => !filteredItems.includes(genre)));
}))

我猜你是从外部来源获取这些数据。 如果是这样,您应该在componentDidMount 函数中获取您的数据,并在收到数据后立即设置状态(在then 函数内或await 语句之后,具体取决于您喜欢哪种方式)。

【讨论】:

  • 谢谢。我刚刚尝试过,是的,可以确认它确实返回 true,但我不确定在这种情况下如何进行。我是否需要一种完全不同的方法来做到这一点,或者有没有一种方法可以说如果它是真的,那么返回带有过滤项目的新状态?谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 2020-11-29
  • 2020-06-22
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多